Get value of dynamically chosen class constant in PHP

PhpClass Constants

Php Problem Overview


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.

Php Solutions


Solution 1 - Php

Use the constant() function:

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

Solution 2 - Php

Use Reflection

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

Solution 3 - Php

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

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

Solution 4 - Php

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'

Solution 5 - Php

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

Solution 6 - Php

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
}

Solution 7 - Php

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

Solution 8 - Php

I know I'm a bit late, but I hope this can help anyway.

Based on Phil's answer, I created a default enumerator class that can be extended.

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';
}

You can call this method like this

CustomEnum::getConstantText('something');

It will return 'abcd'.

The function get_called_class() is a function that returns the class name that called this method and it works specifically for static methods.

In this case $child_class value will be CustomEnum::class. ReflectionClass accepts strings and object as parameter.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBenView Question on Stackoverflow
Solution 1 - PhpDan SimonView Answer on Stackoverflow
Solution 2 - PhpPhilView Answer on Stackoverflow
Solution 3 - PhpJordi KroonView Answer on Stackoverflow
Solution 4 - PhpGlutexoView Answer on Stackoverflow
Solution 5 - PhpJoshView Answer on Stackoverflow
Solution 6 - PhpcrmpiccoView Answer on Stackoverflow
Solution 7 - PhpAndreiView Answer on Stackoverflow
Solution 8 - PhpGabriele RulliView Answer on Stackoverflow