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 ''

