PHP 后期静态绑定

phpserver side programmingprogramming更新于 2025/8/19 18:22:17

简介

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() {
      /* 原始方法被替换;name 的作用域为 test3 */
   }
}
$t3 = new test3();
$t3->name();

输出

输出显示以下异常

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

相关文章