能否将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
相关产品推荐
相关产品推荐

