在这个例子中,PHP将打印“NO”而不是“YES”,与我的预期相反。
如果我删除static
上的function c()
,请将self::
替换为$this->
并执行$e = new B; $e->c();
,这样做会有效。
这是否意味着需要实例化才能使父类中的函数调用继承类中的重写函数?
(旁边的问题:这是一个PHP怪癖,还是这个逻辑也适用于大多数其他编程语言?如果是这样,它背后的理由是什么?)
class A {
static function c() {
self::d();
}
static function d() {
echo "NO :(\n";
}
}
class B extends A {
static function d() {
echo "YES :)\n";
}
}
B::c();
答案 0 :(得分:7)
您需要使用static
关键字代替self
或$this
。
<?php
class A {
static function c() {
static::d();
}
static function d() {
echo "NO :(\n";
}
}
class B extends A {
static function d() {
echo "YES :)\n";
}
}
B::c();
// YES :)
此行为称为Late Static Bindings。