您好,欢迎访问一九零五行业门户网

php延迟绑定和非延迟绑定解析

php版本: php5.6
延迟绑定有:  get_class($this), get_called_class(), new static(), static::
非延迟绑定有:get_class(), __class__, new self(), self::
使用new static()时
<?phpclass newstatic{ //该类的实例 private $newstatic; //判断$newstatic是否为空,为空则实例化自身并存入$newstatic public function init() { if (empty($this -> newstatic)) {            $this -> newstatic = new static();            echo 该类已初始化;         }        else {            $this -> newstatic -> exec();         }     }    //该类的执行方法     public function exec()     {         echo 该类newstatic已执行;     } }class sub extends newstatic{     //覆盖父类中的exec方法,用于区分     public function exec()     {         echo 该类sub已执行;     } }echo <h3>newstatic的测试结果</h3>;$newstatic = new newstatic();echo 第一次执行初始化的结果:<br>;$newstatic -> init(); // 输出结果: 该类已初始化echo <br>第二次执行初始化的结果:<br>;$newstatic -> init(); //输出结果: 该类newstatic已执行echo <h3>newstatic的子类sub的测试结果</h3>;$sub = new sub();echo 第一次执行初始化的结果:<br>;$sub -> init(); // 输出结果: 该类已初始化echo <br>第二次执行初始化的结果:<br>;$sub -> init();  //输出结果: 该类sub已执行
将static替换为self
<?phpclass newstatic{ //该类的实例 private $newstatic; //判断$newstatic是否为空,为空则实例化自身并存入$newstatic public function init() { if (empty($this -> newstatic)) {            $this -> newstatic = new self();  //修改此处的static为self             echo 该类已初始化;         }        else {            $this -> newstatic -> exec();         }     }    //该类的执行方法     public function exec()     {         echo 该类newstatic已执行;     } }class sub extends newstatic{     //覆盖父类中的exec方法,用于区分     public function exec()     {         echo 该类sub已执行;     } }echo <h3>newstatic的测试结果</h3>;$newstatic = new newstatic();echo 第一次执行初始化的结果:<br>;$newstatic -> init(); // 输出结果: 该类已初始化echo <br>第二次执行初始化的结果:<br>;$newstatic -> init(); //输出结果: 该类newstatic已执行echo <h3>newstatic的子类sub的测试结果</h3>;$sub = new sub();echo 第一次执行初始化的结果:<br>;$sub -> init(); // 输出结果: 该类已初始化echo <br>第二次执行初始化的结果:<br>;$sub -> init();  //输出结果: 该类newstatic已执行 此处输出的结果发生了变化
结论:
    如果在子类中调用父类中含有new static()的方法时,它实例化子类,但是如果是父类中使用的是new self()的话,那么实例化的就是父类了,new self()永远指向定义的那个类,而new static() 会绑定调用时的那个类(延迟绑定)这就是new static()和new self()的区别。这个区别实际上跟static::和self::的区别是一样的,使用static::调用静态方法时调用的是延迟绑定后的类的静态方法,而self::指向定义的静态类的方法 另外要补充的一点new self()等同于如下写法:$class = get_class(); //注意:这里的get_class()里边没有传递参数$obj = new $class(); 或者$class = __class__;$obj = new $class();new static()等同于如下写法:$class = get_called_class();$obj = new $class(); 或者$class = get_class($this); // 这里get_class()有没有传递参数效果是不一样的,跟这个函数本身的特性有关$obj = new $class();
相关推荐:
php中关于静态延迟绑定与普通静态效率的对比详解
php中父类与子类的晚期绑定/延迟绑定
php 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定_php实例
以上就是php延迟绑定和非延迟绑定解析的详细内容。
其它类似信息

推荐信息