Get value of dynamically chosen class constant in PHP

心不动则不痛 提交于 2019-11-27 00:55:00

问题


I would like to be able to do something like this:

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

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

This doesn't work. Is there a straightforward way of doing something equivalent? Note that I'm stuck with the class; it's in a library I can't rewrite. I'm writing code that takes arguments on the command line, and I would really like it to take symbolic names instead of id numbers.


回答1:


$id = constant("ThingIDs::$thing");

http://php.net/manual/en/function.constant.php




回答2:


Use Reflection

$r = new ReflectionClass('ThingIDs');
$id = $r->getConstant($thing);



回答3:


If you are using namespaces, you should include the namespace with the class.

echo constant('My\Application\ThingClass::ThingConstant'); 



回答4:


<?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');



回答5:


Helper function

You can use a function like this:

function class_constant($class, $constant)
{
    if ( ! is_string($class)) {
        $class = get_class($class);
    }

    return constant($class . '::' . $constant);
}

It takes two arguments:

  • Class name or object instance
  • Class constant name

If an object instance is passed, its class name is inferred. If you use PHP 7, you can use ::class to pass appropriate class name without having to think about namespaces.

Examples

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'



回答6:


If you have a reference to the class itself then you can do the following:

if (defined(get_class($course). '::COURSES_PER_INSTANCE')) {
   // class constant is defined
}



回答7:


My problem was similiar to this subject. When you have the object, but not the class name, you could use:

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

$constant_value = constant($class_name.'::'.$class_const);


来源:https://stackoverflow.com/questions/6147102/get-value-of-dynamically-chosen-class-constant-in-php

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!