You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将Late Static Binding用于非静态成员?解析文档表述并求示例

关于PHP延迟静态绑定在非静态成员中的使用

可以将延迟静态绑定(Late Static Binding)用于非静态成员,PHP文档中提到的“不限于静态方法调用”,意思是static::这个语法不仅能在静态方法里使用,在非静态的实例方法中同样可以生效,它依然会根据运行时的实际类(而非方法定义所在的类)来解析目标属性或方法。

举两个简单示例说明:

示例1:非静态方法中用static::访问属性

class ParentClass {
    protected string $name = 'Parent';

    // 这是一个非静态的实例方法
    public function getName() {
        // 使用static::而非self::,会绑定到运行时的实际类
        return static::$name;
    }
}

class ChildClass extends ParentClass {
    protected string $name = 'Child';
}

// 调用测试
$parent = new ParentClass();
echo $parent->getName(); // 输出:Parent

$child = new ChildClass();
echo $child->getName(); // 输出:Child

如果这里用self::$name,那么不管是父类还是子类实例调用,都会输出Parent,因为self::是编译时绑定到方法定义的类(ParentClass);而static::是运行时绑定,会识别出实例实际所属的子类,从而返回子类的$name值。

示例2:非静态方法中用static::调用非静态方法

class ParentClass {
    public function sayHello() {
        echo "Hello from Parent\n";
    }

    // 非静态实例方法
    public function callHello() {
        // 在非静态方法里用static::调用非静态方法
        static::sayHello();
    }
}

class ChildClass extends ParentClass {
    public function sayHello() {
        echo "Hello from Child\n";
    }
}

$child = new ChildClass();
$child->callHello(); // 输出:Hello from Child

这里callHello是非静态方法,内部通过static::sayHello()调用方法时,会根据运行时的实例类(ChildClass),执行子类重写后的sayHello方法,而非父类的原方法。

内容的提问来源于stack exchange,提问作者jwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:15:04