我希望能够做到这样的事情:
class ThingIDs
{
const Something = 1;
const AnotherThing = 2;
}
$thing = 'Something';
$id = ThingIDs::$thing;
这不起作用。做一些等效的直接方式吗?请注意,我坚持上课;它在图书馆我无法重写。我正在编写在命令行上接受参数的代码,我会真的喜欢使用符号名而不是id号。
答案 0 :(得分:169)
$id = constant("ThingIDs::$thing");
答案 1 :(得分:25)
使用反思
$r = new ReflectionClass('ThingIDs');
$id = $r->getConstant($thing);
答案 2 :(得分:11)
如果您使用的是名称空间,则应该在名称空间中包含该名称空间。
echo constant('My\Application\ThingClass::ThingConstant');
答案 3 :(得分:2)
<?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');
答案 4 :(得分:2)
您可以使用以下功能:
function class_constant($class, $constant)
{
if ( ! is_string($class)) {
$class = get_class($class);
}
return constant($class . '::' . $constant);
}
需要两个参数:
如果传递了对象实例,则推断其类名。如果使用PHP 7,则可以使用::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'
答案 5 :(得分:0)
如果你有对类本身的引用,那么你可以执行以下操作:
if (defined(get_class($course). '::COURSES_PER_INSTANCE')) {
// class constant is defined
}
答案 6 :(得分:0)
我的问题类似于这个主题。当有对象但没有类名时,可以使用:
$class_name = get_class($class_object);
$class_const = 'My_Constant';
$constant_value = constant($class_name.'::'.$class_const);
答案 7 :(得分:0)
我知道我来晚了,但是我希望这对您有所帮助。
基于Phil的答案,我创建了一个默认的枚举器类,该类可以扩展。
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'
。
函数get_called_class()
是一个返回调用此方法的类名的函数,它专门用于静态方法。
在这种情况下,$child_class
的值为CustomEnum::class
。 ReflectionClass接受字符串和对象作为参数。