[英]Check if constant was overridden in child class in constructor of parent class?
我有一个定义几个常量的抽象类。 大多数这些常量都不会被任何子类覆盖,但应该是。 我在抽象类中将此常量定义为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!” 即使常数被覆盖,也会被抛出。 我理解我可以简单地将它作为构造函数中的必需参数,并以这种方式设置成员变量(这可能是更符合逻辑/实际的解决方案)。
在我的情况下,为此目的使用常量可能没有多大意义,但我仍然想知道为什么这不起作用。 应该可以覆盖子类中的常量。 在调用构造函数之后,这种覆盖是否只会发生? 我的支票不正确吗? 很高兴理解这里发生的事件的逻辑和顺序。
您需要将参数传递给defined()
作为字符串:
if (!defined('self::TEST_CONSTANT')) {
否则,你正在测试是否存在一个名为null的全局常量(不是'null'而是一个实际的null,这是毫无意义的)....如果你试图确定是否定义了一个名为value
的全局常量,那么您可能还需要考虑static::TEST_CONSTANT
, static::TEST_CONSTANT
从您已实例化的子类( 'value'
)中获取static::TEST_CONSTANT
'value'
并测试以查看名称value
是否具有全局常量已定义。
您需要使用后期静态构建来从父类访问静态子属性(和常量):
abstract class ParentClass {
const TEST_CONSTANT = null;
public function __construct()
{
if (!defined(static::TEST_CONSTANT)) {
throw new Exception("Please define TEST_CONSTANT!");
}
}
abstract protected function someFunction();
}
说,重写常量看起来有点不寻常。 我很好奇usecase为什么你需要它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.