gpt4 book ai didi

PHP 方法范围绑定(bind)

转载 作者:可可西里 更新时间:2023-10-31 22:46:43 24 4
gpt4 key购买 nike

我对 PHP 如何在父子层次结构中调用方法感到困惑。这是代码

class A {
private function foo() {
echo "A!";
}
public function test() {
$this->foo();
}
}

class C extends A {
public function foo() {
echo 'C!';
}
}

$c = new C();
$c->test();

输出是A!

考虑另一个例子,但只将类A 中的foo() 方法可见性更改为public

class A {
public function foo() {
echo "A!";
}
public function test() {
$this->foo();
}
}

class C extends A {
public function foo() {
echo 'C!';
}
}

$c = new C();
$c->test();

这个输出是C!

欢迎任何解释。

最佳答案

规则:对象上的privatefinal 方法将始终直接调用,而无需查阅覆盖表。强>

这条规则是baked into the engine :

/* Check if this calls a known method on $this */
if (opline->op1_type == IS_UNUSED && opline->op2_type == IS_CONST &&
CG(active_class_entry) && zend_is_scope_known()) {
zend_string *lcname = Z_STR_P(CT_CONSTANT(opline->op2) + 1);
fbc = zend_hash_find_ptr(&CG(active_class_entry)->function_table, lcname);

/* We only know the exact method that is being called if it is either private or final.
* Otherwise an overriding method in a child class may be called. */
if (fbc && !(fbc->common.fn_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_FINAL))) {
fbc = NULL;
}
}

“为什么”,你问?答案是:因为它就是这样运作的。在语言设计中,这称为“名称隐藏”,由语言来指定名称隐藏的工作方式。以 C++ 为例。它定义明确,complex名称隐藏规则。 PHP 有它自己的规则。它们不同于 C++。但它们是 PHP 所独有的。这只是你必须记住的关于语言的东西。

不过,我承认文档可以更好地说明这一点。

关于PHP 方法范围绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53111792/

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