125

我希望能够做这样的事情:

class ThingIDs
{
    const Something = 1;
    const AnotherThing = 2;
}

$thing = 'Something';
$id = ThingIDs::$thing;

这行不通。有没有一种直接的方法来做等效的事情?请注意,我坚持上课;它在我无法重写的库中。我正在编写在命令行上接受参数的代码,我真的希望它采用符号名称而不是 id 编号。

4

8 回答 8

205

使用常量()函数:

$id = constant("ThingIDs::$thing");
于 2011-05-27T02:20:20.483 回答
30

使用反射

$r = new ReflectionClass('ThingIDs');
$id = $r->getConstant($thing);
于 2011-05-27T02:19:40.883 回答
15

如果你使用命名空间,你应该在类中包含命名空间。

echo constant('My\Application\ThingClass::ThingConstant'); 
于 2014-10-07T07:26:00.950 回答
5

辅助函数

你可以使用这样的函数:

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'
于 2018-01-02T17:03:31.687 回答
3
<?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');
于 2011-05-27T02:21:25.943 回答
0

如果您有对类本身的引用,那么您可以执行以下操作:

if (defined(get_class($course). '::COURSES_PER_INSTANCE')) {
   // class constant is defined
}
于 2016-09-02T06:22:08.243 回答
0

我的问题与这个主题相似。当您拥有对象但没有类名时,您可以使用:

$class_name = get_class($class_object);
$class_const = 'My_Constant';

$constant_value = constant($class_name.'::'.$class_const);
于 2019-09-24T04:44:19.133 回答
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 接受字符串和对象作为参数。

于 2020-11-09T15:04:14.773 回答