检查 parent class 的构造函数中 child class 中的常量是否被覆盖?
Check if constant was overridden in child class in constructor of parent class?
我有一个摘要class,它定义了几个常量。大多数这些常量不会被任何 child class 覆盖,但是 应该 被覆盖。
我在我的摘要 class 中将这个常量定义为 null,在 child class 中我给它赋值。构造函数在所有 child classes 中也是相同的,所以我添加了一个检查来查看常量是否被赋值,如果它没有被定义则抛出异常child class.
一些简化的代码来描述我的问题:
Parent摘要class:
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();
}
Child class:
class ChildClass extends ParentClass {
const TEST_CONSTANT = "value";
protected function someFunction()
{
//some functionality here
}
}
然而,在实例化 ChildClass 时,将抛出异常 "Please define TEST_CONSTANT!",即使常量已被覆盖。我明白我可以简单地将它作为构造函数中的强制参数,并以这种方式设置一个成员变量(这可能是更 logical/practical 的解决方案)。
在我的例子中,为此目的使用常量可能没有多大意义,但我仍然想了解为什么这不起作用。
应该可以覆盖 child classes 中的常量。这种覆盖是否只是在调用构造函数之后才发生?我的支票不正确吗?很高兴了解这里发生的事件的逻辑和顺序。
您需要将参数作为字符串传递给 defined()
:
if (!defined('self::TEST_CONSTANT')) {
否则,您正在测试是否存在一个名为 null 的全局常量(不是 'null',而是一个实际的 null,这毫无意义)...如果您试图确定一个定义了名为 value
的全局常量,那么您可能还想考虑 static::TEST_CONSTANT
,它将从您实例化的子 class 中获取 static::TEST_CONSTANT
的值( 'value'
) 并测试是否定义了名称为 value
的全局常量。
您需要使用 late static building 从父 class 访问静态子属性(和常量):
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();
}
话虽如此,覆盖常量看起来有点不寻常。我很好奇用例为什么你需要它。
我有一个摘要class,它定义了几个常量。大多数这些常量不会被任何 child class 覆盖,但是 应该 被覆盖。 我在我的摘要 class 中将这个常量定义为 null,在 child class 中我给它赋值。构造函数在所有 child classes 中也是相同的,所以我添加了一个检查来查看常量是否被赋值,如果它没有被定义则抛出异常child class.
一些简化的代码来描述我的问题:
Parent摘要class:
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();
}
Child class:
class ChildClass extends ParentClass {
const TEST_CONSTANT = "value";
protected function someFunction()
{
//some functionality here
}
}
然而,在实例化 ChildClass 时,将抛出异常 "Please define TEST_CONSTANT!",即使常量已被覆盖。我明白我可以简单地将它作为构造函数中的强制参数,并以这种方式设置一个成员变量(这可能是更 logical/practical 的解决方案)。
在我的例子中,为此目的使用常量可能没有多大意义,但我仍然想了解为什么这不起作用。 应该可以覆盖 child classes 中的常量。这种覆盖是否只是在调用构造函数之后才发生?我的支票不正确吗?很高兴了解这里发生的事件的逻辑和顺序。
您需要将参数作为字符串传递给 defined()
:
if (!defined('self::TEST_CONSTANT')) {
否则,您正在测试是否存在一个名为 null 的全局常量(不是 'null',而是一个实际的 null,这毫无意义)...如果您试图确定一个定义了名为 value
的全局常量,那么您可能还想考虑 static::TEST_CONSTANT
,它将从您实例化的子 class 中获取 static::TEST_CONSTANT
的值( 'value'
) 并测试是否定义了名称为 value
的全局常量。
您需要使用 late static building 从父 class 访问静态子属性(和常量):
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();
}
话虽如此,覆盖常量看起来有点不寻常。我很好奇用例为什么你需要它。