gpt4 book ai didi

php - PHP 中的后期静态绑定(bind)

转载 作者:可可西里 更新时间:2023-10-31 23:23:54 25 4
gpt4 key购买 nike

我正在阅读有关 LSB 功能的 php 手册,我了解它在静态上下文中的工作原理,但我不太了解它在非静态上下文中的工作原理。手册中的例子是这样的:

<?php
class A {
private function foo() {
echo "success!\n";
}
public function test() {
$this->foo();
static::foo();
}
}

class B extends A {
/* foo() will be copied to B, hence its scope will still be A and
* the call be successful */
}

class C extends A {
private function foo() {
/* original method is replaced; the scope of the new one is C */
}
}

$b = new B();
$b->test();
$c = new C();
$c->test(); //fails
?>

输出是这样的:

success!
success!
success!


Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9

我不明白对于B类,A中的私有(private)方法如何继承给B?谁能告诉我这里发生了什么?非常感谢!

最佳答案

后期静态绑定(bind)的使用只会改变为调用选择的方法。一旦选择了方法,就会应用可见性规则来确定它是否可以被调用。

对于 BA::test 查找并调用 A::fooB 中的注释不正确——foo 未复制到 B。由于它是私有(private)的,因此只能从 A 中的其他方法调用,例如 A::test

C 失败,因为后期静态绑定(bind)机制定位了私有(private)方法C::foo,但是A 的方法无法访问它。

我建议您为静态字段和方法保留后期静态绑定(bind)以避免混淆。

关于php - PHP 中的后期静态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10060431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com