繁体   English   中英

检查父类的构造函数中的子类是否覆盖了常量?

[英]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_CONSTANTstatic::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM