简体   繁体   中英

Accessing a class constant using a simple variable which contains the name of the constant

I'm trying to access a class constant in one of my classes:

const MY_CONST = "value";

If I have a variable which holds the name of this constant like this:

$myVar = "MY_CONST";

Can I access the value of MY_CONST somehow?

self::$myVar

does not work obviously because it is for static properties. Variable variables does not work either.

There are two ways to do this: using the constant function or using reflection .

Constant Function

The constant function works with constants declared through define as well as class constants:

class A
{
    const MY_CONST = 'myval';

    static function test()
    {
        $c = 'MY_CONST';
        return constant('self::'. $c);
    }
}

echo A::test(); // output: myval

Reflection Class

A second, more laborious way, would be through reflection:

$ref = new ReflectionClass('A');
$constName = 'MY_CONST';
echo $ref->getConstant($constName); // output: myval

There is no syntax for that, but you can use an explicit lookup:

print constant("classname::$myConst");

I believe it also works with self:: .

Can I access the value of MY_CONST somehow?

self::MY_CONST

If you want to access is dynamically, you can use the reflection API Docs :

$myvar = 'MY_CONST';
$class = new ReflectionClass(self);
$const = $class->getConstant($myVar);

The benefit with the reflection API can be that you can get all constants at once ( getConstants ).

If you dislike the reflection API because you don't wanna use it, an alternative is the constant function ( Demo ):

$myvar = 'MY_CONST';    
class foo {const MY_CONST = 'bar';}    
define('self', 'foo');    
echo constant(self.'::'.$myvar);

你有没有尝试过

$myVar = MY_CONST or $myVar = $MY_CONST

Just a note for Reflection: the constructor for ReflectionClass must receive the full path of the class for its parameter. This means that just setting the string 'A' as a constructor parameter may not work in some cases.

To avoid this problem, when using ReflectionClass you will be better if you do this:

$classA = new A();
$name_classA = get_class($classA);
$ref = new ReflectionClass(get_class($name_classA));
$constName = 'MY_CONST';
echo $ref->getConstant($constName);

Function get_class will give you the full path of a class whenever you are in the code. Missing the full path may result in a "Class not found" PHP error.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM