2015-10-02 125 views
2

我在this SO Q&A中发现了一个关于如何检查变量是否存在的详细参考。如何检查一个类是否定义了一个const(特征检测)

要提及的是,检查一个类是否具有一定的特性,一个用途(as documented at php.net):

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

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

$check = defined('MY_CONSTANT'); 

问题:如何在一个类const

要精心... 我有一个类,我在几个项目中使用,(小例子):

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

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

请注意,相同的类用于几个项目(具有不同的值)。在所有现有项目中实施这个新的常量会很麻烦。但是,新功能位于现有脚本中,我可以使用此新版本更新旧项目,而不更新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的警告。我不想要警告,我也不想压制他们...

我错过了什么方法?

回答

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 
} 
+0

但是这并不解决'轮询'未更新的类的问题。有了这个解决方案,我仍然需要到处更新'ProjectSettings'类,不是吗?但我会尝试阅读更多关于ReflectionClass的内容。 –

+0

你将不得不这样做一次。请稍等一下,我会更新我的答案,以便如何从课外获得它 – baao

+0

已更新它@MartenKoetsier。你可以用这个来检查,如果它不存在就不会抛出错误! – baao

相关问题