Version php : php5.6
La liaison différée inclut : get_class($this), get_call_class(), new static(), static::
La liaison non différée inclut : get_class (), __CLASS__, new self(), self::
Lors de l'utilisation de 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已执行
remplacer static par 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已执行 此处输出的结果发生了变化
Conclusion :
如果在子类中调用父类中含有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();
Recommandations associées :
PHP Liaison tardive /delay liaison du parent et des sous-classes
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!