我希望能够做这样的事情:
class ThingIDs { const Something = 1; const AnotherThing = 2; } $thing = 'Something'; $id = ThingIDs::$thing;
这不管用。有没有一种简单易行的方法来做相同的事情?注意,我被这个类困住了; 它在一个无法重写的库中。我编写的代码在命令行中使用参数,我希望 真的使用符号名,而不是 id 号。
使用反射
$r = new ReflectionClass('ThingIDs'); $id = $r->getConstant($thing);
使用 常数()函数:
$id = constant("ThingIDs::$thing");
<?php class Dude { const TEST = 'howdy'; } function symbol_to_value($symbol, $class){ $refl = new ReflectionClass($class); $enum = $refl->getConstants(); return isset($enum[$symbol])?$enum[$symbol]:false; } // print 'howdy' echo symbol_to_value('TEST', 'Dude');
如果使用命名空间,则应将该命名空间包括在类中。
echo constant('My\Application\ThingClass::ThingConstant');
如果你有一个对类本身的引用,那么你可以这样做:
if (defined(get_class($course). '::COURSES_PER_INSTANCE')) { // class constant is defined }
您可以使用如下函数:
function class_constant($class, $constant) { if ( ! is_string($class)) { $class = get_class($class); } return constant($class . '::' . $constant); }
这需要两个理由:
如果传递了对象实例,则推断其类名。如果使用 PHP7,则可以使用 ::class传递适当的类名,而不必考虑名称空间。
::class
class MyClass { const MY_CONSTANT = 'value'; } class_constant('MyClass', 'MY_CONSTANT'); # 'value' class_constant(MyClass::class, 'MY_CONSTANT'); # 'value' (PHP 7 only) $myInstance = new MyClass; class_constant($myInstance, 'MY_CONSTANT'); # 'value'
我的问题与这个主题类似。当你有对象,但没有类名时,你可以使用:
$class_name = get_class($class_object); $class_const = 'My_Constant'; $constant_value = constant($class_name.'::'.$class_const);
我知道我迟到了,但我希望这个能帮上忙。
根据 菲尔的答案,我创建了一个可以扩展的默认枚举器类。
class DefaultEnum { static public function getConstantText(string $constant) { try { // Get child class name that called this method $child_class = get_called_class(); $reflection = new ReflectionClass($child_class); $const = $reflection->getConstant($constant); return $const; } catch (\ReflectionException $e) { // ... } } } class CustomEnum extends DefaultEnum { const something = 'abcd'; const something2 = 'ABCD'; }
您可以像这样调用此方法
CustomEnum::getConstantText('something');
它将返回 'abcd'。
'abcd'
函数 get_called_class()是一个返回调用此方法的类名的函数,它专门用于静态方法。
get_called_class()
在这种情况下,$child_class值将是 CustomEnum::class.RefectionClass 接受字符串和对象作为参数。
$child_class
CustomEnum::class