PHP 延迟静态绑定


简介

PHP 中的延迟静态绑定功能用于在静态继承中引用被调用的类。当调用静态方法时,类名与作用域解析运算符 (::) 一起使用,而在其他实例方法的情况下,我们使用对象名来调用它们。static:: 不会使用定义方法的类来解析,而是使用运行时信息计算。对当前类的静态引用使用函数所属的类来解析,而不是它被定义的位置。

示例

在以下代码中,父类使用 self:: 前缀调用静态方法。当使用子类调用相同的方法时,它不会引用子类名,因为它没有被解析。

示例

 在线演示

<?php
class test1{
   public static $name="Raja";
   public static function name(){
      echo "name of class :" . __CLASS__;
   }
   public static function getname(){
      self::name();
   }
}
class test2 extends test1{
   public static function name(){
      echo "name of class :" . __CLASS__;
   }
}
test2::getname();
?>

输出

结果显示,与预期相反,返回了父类名。

name of class :test1

使用 static:: 代替 self:: 会在运行时创建延迟绑定。

示例

 在线演示

<?php
class test1{
   public static function name(){
      echo "name of class :" . __CLASS__;
   }
   public static function getname(){
      static::name();
   }
}
class test2 extends test1{
   public static function name(){
      echo "name of class :" . __CLASS__;
   }
}
test2::getname();
?>

上面的代码现在按预期返回子类名。

输出

name of class :test2

在非静态上下文中使用 static::

父类中的私有方法被复制到子类,因此它的作用域仍然是父类。

示例

 在线演示

<?php
class test1{
   private function name(){
      echo "name of class :" . __CLASS__ ."
";    }    public function getname(){       $this->name();       static::name();    } } class test2 extends test1{    // } $t2=new test2(); $t2->getname(); ?>

输出

输出显示以下结果

name of class :test1
name of class :test1

但是,当覆盖父方法时,其作用域会发生变化。

示例

class test3 extends test1{
   private function name() {
      /* original method is replaced; the scope of name is test3 */
   }
}
$t3 = new test3();
$t3->name();

输出

输出显示以下异常

PHP Fatal error: Uncaught Error: Call to private method test3::name() from context ''

更新于: 2020-09-18

209 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告