【发布时间】:2016-01-26 16:45:25
【问题描述】:
我有一个定义了几个常量的抽象类。这些常量中的大多数不会被任何子类覆盖,但一个应该被覆盖。 我在抽象类中将这个常量定义为 null,并在子类中为它分配一个值。构造函数在所有子类中也是相同的,所以我添加了一个检查来查看常量是否被赋值,如果子类没有定义它,则抛出异常。
一些简化的代码来勾勒我的问题:
父抽象类:
abstract class ParentClass {
const TEST_CONSTANT = null;
public function __construct()
{
if (!defined(self::TEST_CONSTANT)) {
throw new Exception("Please define TEST_CONSTANT!");
}
}
abstract protected function someFunction();
}
儿童班:
class ChildClass extends ParentClass {
const TEST_CONSTANT = "value";
protected function someFunction()
{
//some functionality here
}
}
但是,在实例化 ChildClass 时,出现异常“请定义 TEST_CONSTANT!”将被抛出,即使常量被覆盖。我知道我可以简单地将它作为构造函数中的强制参数,并以这种方式设置一个成员变量(这可能是更合乎逻辑/实用的解决方案)。
就我而言,为此目的使用常量可能没有多大意义,但我仍然想了解为什么这不起作用。 应该可以覆盖子类中的常量。直到调用构造函数之后才会发生这种覆盖吗?我的支票不正确吗?很高兴了解这里发生的事件的逻辑和顺序。
【问题讨论】:
-
也许您应该使用
static::TEST_CONSTANT而不是self::TEST_CONSTANT?
标签: php oop overriding constants