我试图获取扩展类的常量值,但是在抽象类的方法中。像这样:
abstract class Foo { public function method() { echo self::constant; } } class Bar extends Foo { const constant = "I am a constant"; } $bar = new Bar(); $bar->method();
然而,这会导致致命错误。有没有办法做到这一点?
答案 0 :(得分:3)
本质上,self
指代编写代码的当前类,而static
指代代码运行的类。
我们可以将您的代码段重写为:
abstract class Foo {
public function method() {
echo static::constant; // Note the static keyword here
}
}
class Bar extends Foo {
const constant = "I am a constant";
}
$bar = new Bar();
$bar->method();
但是,这种编码模式很脏,您可能应该改为在父类和子类之间引入受保护的api,以来回传递此类信息。
因此,从代码组织的角度来看,我将更倾向于 Morfildur 提出的解决方案。
答案 1 :(得分:2)
这是不可能的。一种可能的解决方案是创建一个在子类中返回所需值的虚方法,即
abstract class Foo {
protected abstract function getBar();
public function method() {
return $this->getBar();
}
}
class Bar extends Foo {
protected function getBar() {
return "bar";
}
}