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

时间:2015-10-02 15:43:46

标签: php

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

提到要检查某个类是否具有某个属性,可以使用(as documented at php.net):

$check = property_exists('MyClass', 'property_name');

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

$check = defined('MY_CONSTANT');

问题:班级const怎么样?

详细阐述...... 我有一个课程,我在几个项目中使用,(最小的例子):

class ProjectSettings {
    const MY_CONSTANT = 'my constant';
}

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

请注意,在多个项目中使用相同的类(具有不同的值)。在所有现有项目中实施这个新的const会很麻烦。但是,新功能在现有脚本中,我可以使用此新版本更新旧项目,而不更新ProjectSettings类(对于eaxample,如果甚至不使用此新功能)。这就是我想使用特征检测的原因。

我正在思考:

if (defined(ProjectSettings::MY_CONSTANT)) {
    $setting = ProjectSettings::MY_CONSTANT;
} else {
    $setting = 'some default value';
}

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

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...

通过constant('ProjectSettings::MY_OTHER')的路线似乎很有希望,但它会生成PHP警告。我不想收到警告,我也不想压制它们......

我错过了哪种方法?

1 个答案:

答案 0 :(得分:3)

您可以使用ReflectionClass::getClassConstants()输出所有定义的常量,或ReflectionClass::getClassConstant()输出给定常量的结果。请参阅下面的示例。

如果可以扩展类,请添加静态函数,如:

class myClass
{
    const TEST = 'foo';
    static function getConstants()
    {
        $oClass = new \ReflectionClass(__CLASS__);
        return $oClass->getConstants();
    }
}

输出所有常量:

var_dump(myClass::getConstants());

如果您无法扩展课程,可以在任何文件中查看:

$c = new myClass();
$a = new \ReflectionClass($c);
var_dump( $a->getConstant('FOO'));
// false
var_dump( $a->getConstant('TEST'));
// string(3) "foo"

// Or with a real check: 

if ($a->getConstant('TEST')) {
    // constant is defined
} else {
    // it is not
}