如何检查一个类是否定义了const(特征检测)

Mar*_*ier 3 php

我在这个 SO Q&A中找到了关于如何检查变量是否存在的详细参考。

提到要检查一个类是否具有某个属性,可以使用(如 php.net 中所述):

$check = property_exists('MyClass', 'property_name');
Run Code Online (Sandbox Code Playgroud)

另外,对于“定义”的“常量”,可以使用:

$check = defined('MY_CONSTANT');
Run Code Online (Sandbox Code Playgroud)

问题:const班级里的a怎么样?

详细说明...我有一个在多个项目中使用的类(最小示例):

class ProjectSettings {
    const MY_CONSTANT = 'my constant';
}
Run Code Online (Sandbox Code Playgroud)

我正在编写一个新功能,它需要“项目设置”,但如果该设置在类中不存在,则应应用默认值。

请注意,同一个类在多个项目中使用(具有不同的值)。在所有现有项目中实施这个新的常量将会很麻烦。但是,新功能位于现有脚本中,我可以使用此新版本更新旧项目,而无需更新 ProjectSettings 类(例如,如果甚至没有使用此新功能)。这就是为什么我想使用特征检测。

我在想:

if (defined(ProjectSettings::MY_CONSTANT)) {
    $setting = ProjectSettings::MY_CONSTANT;
} else {
    $setting = 'some default value';
}
Run Code Online (Sandbox Code Playgroud)

然而,我徒劳的尝试导致:

var_dump(ProjectSettings::MY_CONSTANT);
// string(11) "my constant"
// (as expected)
var_dump(ProjectSettings::MY_OTHER);
// generates a PHP Fatal error

var_dump(defined(ProjectSettings::MY_CONSTANT));
// bool(false)
// (it exists, but is not 'defined', oh well...)
var_dump(defined(ProjectSettings::MY_OTHER));
// generates PHP Fatal error

var_dump(get_class_vars('ProjectSettings'));
// array(0) {
// }
// (MY_OTHER is not there, but neither is MY_CONSTANT...)

var_dump(isset(ProjectSettings::MY_CONSTANT));
// generates a PHP Fatal error

var_dump(null !== ProjectSettings::MY_CONSTANT);
// bool(true)
var_dump(null !== ProjectSettings::MY_OTHER);
// generates a PHP Fatal error

var_dump(constant('ProjectSettings::MY_CONSTANT'));
// string(11) "my constant"
// (as expected)
var_dump(constant('ProjectSettings::MY_OTHER'));
// NULL
// BUT: this generates a PHP Warning

var_dump(property_exists('ProjectSettings', 'MY_CONSTANT'));
// bool(false)
var_dump(property_exists('ProjectSettings', 'MY_OTHER'));
// bool(false)

var_dump(get_defined_constants());
// produces a whole bunch of constants, but not the ones in the class...
Run Code Online (Sandbox Code Playgroud)

路线 viaconstant('ProjectSettings::MY_OTHER')看起来很有希望,但它会生成 PHP 警告。我不想收到警告,也不想压制它们......

我错过了什么方法?

Kév*_*las 8

将字符串传递给defined()允许不依赖反射:

var_dump(
    defined(ProjectSettings::class."::TEST")
);
Run Code Online (Sandbox Code Playgroud)

true如果常量存在,此代码将打印,false如果不存在(不会触发错误)。