PHP 中的抽象常量 - 强制子类定义常量

2022-08-30 09:20:18

我注意到PHP中不能有抽象常量。

有没有办法强制子类定义一个常量(我需要在其中一个抽象类内部方法中使用)?


答案 1

这可能有点“黑客”,但只需很少的努力即可完成工作,但是如果未在子类中声明常量,则只会显示不同的错误消息。

自引用常量声明在语法上是正确的,并且可以毫无问题地进行解析,仅当该声明在运行时实际执行时才引发错误,因此必须在子类中重写抽象类中的自引用声明,否则会出现致命错误:。Cannot declare self-referencing constant

在此示例中,抽象父类强制其所有子类声明变量 。此代码运行良好,输出 .但是,如果子类声明变量,则将触发致命错误。FooNAMEDonaldFooling

<?php

abstract class Foo {

    // Self-referential 'abstract' declaration
    const NAME = self::NAME;

}

class Fooling extends Foo {

    // Overrides definition from parent class
    // Without this declaration, an error will be triggered
    const NAME = 'Donald';

}

$fooling = new Fooling();

echo $fooling::NAME;

答案 2

A 是 ;据我所知,PHP中没有或常量,但你可以有一个解决方法:constantconstantabstractprivate

示例抽象类

abstract class Hello {
    const CONSTANT_1 = 'abstract'; // Make Abstract
    const CONSTANT_2 = 'abstract'; // Make Abstract
    const CONSTANT_3 = 'Hello World'; // Normal Constant
    function __construct() {
        Enforcer::__add(__CLASS__, get_called_class());
    }
}

这将运行良好

class Foo extends Hello {
    const CONSTANT_1 = 'HELLO_A';
    const CONSTANT_2 = 'HELLO_B';
}
new Foo();

将返回错误

class Bar extends Hello {
    const CONSTANT_1 = 'BAR_A';
}
new Bar();

松果将返回错误

class Songo extends Hello {

}
new Songo();

执行器类

class Enforcer {
    public static function __add($class, $c) {
        $reflection = new ReflectionClass($class);
        $constantsForced = $reflection->getConstants();
        foreach ($constantsForced as $constant => $value) {
            if (constant("$c::$constant") == "abstract") {
                throw new Exception("Undefined $constant in " . (string) $c);
            }
        }
    }
}

推荐