php后期静态绑定

在观看laravel源码的时候,突然看到了

public static function getInstance()
    {
        if (is_null(static::$instance)) {
            static::$instance = new static;
        }

        return static::$instance;
    }

虽然之前翻看手册的时候看到过,但很少使用,于是仔细看了一下,原来是后期静态绑定。但是后期静态绑定又是什么鬼,还是仔细分析下吧。

由来

PHP在继承体系中,调用分为转发调用和非转发调用。

  • 转发调用(可以使用get_called_class()获取调用类的名称)
    *self::*,*parent::*,*static::* 以及 forward_static_call()属于转发调用
  1. 使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类。
  2. 使用 parent:: 表示对当前类的父类的静态引用。
  3. static:: “后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。
    这是什么意思呢?还是通过代码来说比较好,哈哈
class A{
    public static function call(){
       static::who();
    }
    public static function who(){
        echo __CLASS__,'1<br>';
        echo get_called_class(),'2<br>';
    }
}

class B extends A{
    public static function who(){
        echo __CLASS__.'3<br>';
        echo get_called_class(),'5<br>';
    }
}

class C extends B{

}
$c = new C();
C::call();  //结果是B3,C5
class A{
    public static function call(){
       static::who();
    }
    public static function who(){
        echo __CLASS__,'1<br>';
        echo get_called_class(),'2<br>';
    }
}

class B extends A{
    public static function who(){
        echo __CLASS__.'3<br>';
        echo get_called_class(),'5<br>';
    }
}

class C extends B{
    public static function who(){
        echo __CLASS__.'6<br>';
        echo get_called_class(),'7<br>';
    }
}
$c = new C();
C::call(); //结果是C6,C7。
class A{
   static $instance;
}
class B extends A{
    public static function put(){
       return static::$instance = new static ;
    }
}
class C extends B{

}
var_dump(C::put()); // object(C)#1 (0) { }
var_dump(B::put()); // object(B)#1 (0) { }

不知道大家有没有看懂,我认为,static::类似于thisthis是对当前对象的引用,而static::是对当前调用类的引用。

  • 非转发调用
  1. 直接使用类名:: fun()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • php手册上关于后期静态绑定如下解释:后期静态绑定工作原理是存储了在上一个"非转发调用"的类名。 这里我们先明确什...
    kevin_cf阅读 2,325评论 1 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,292评论 19 139
  • 一个需求 做的某项目有一个“转账”的功能,但是转账的类型有很多种,对应每种转账需要的参数也不同,举个例子一种转账是...
    兮嘉阅读 6,859评论 6 6
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,894评论 18 399
  • 风儿,慢慢摇, 留住醉意睡去的日晕, 让禾稻尽情聆听天边, 一字排开雁的音笛。 风儿,慢慢摇, 留住纵情忘我的飞絮...
    云阅岩兮阅读 1,462评论 0 2