Ім'я динамічної константи в PHP


80

Я намагаюся динамічно створити ім'я константи, а потім отримати значення.

define( CONSTANT_1 , "Some value" ) ;

// try to use it dynamically ...
$constant_number = 1 ;
$constant_name = ("CONSTANT_" . $constant_number) ;

// try to assign the constant value to a variable...
$constant_value = $constant_name;

Але я виявляю, що значення константи $ все ще містить ІМЯ константи, а не значення.

Я спробував також другий рівень опосередкованості, $$constant_nameале це зробило б його змінною, а не константою.

Хтось може пролити на це світло?

Відповіді:



73

І продемонструвати, що це також працює з константами класу:

class Joshua {
    const SAY_HELLO = "Hello, World";
}

$command = "HELLO";
echo constant("Joshua::SAY_$command");

12
Варто зауважити, що вам може знадобитися вказати повністю кваліфіковане (з іменами) ім'я класу, якщо константа знаходиться у класі, який відсутній у поточному просторі імен, незалежно від того, додали ви "використання" для класу у своєму файлі.
однобокий

1
Ця відповідь чудова завдяки хорошому прикладу. Це саме те, що я шукав :) Дякую!
ElChupacabra

6
@lopsided ::classКонстанта може бути використана для отримання повністю кваліфікованого простору імен, наприклад:constant(YourClass::class . '::CONSTANT_' . $yourVariable);
Willem-Aart

1
Зауважте, що ::classключове слово доступне з php 5.5
T30,

9

Щоб використовувати динамічні імена констант у своєму класі, ви можете використовувати функцію відображення (починаючи з php5):

$thisClass = new ReflectionClass(__CLASS__);
$thisClass->getConstant($constName);

Наприклад: якщо ви хочете відфільтрувати лише певні (SORT_ *) константи в класі

class MyClass 
{
    const SORT_RELEVANCE = 1;
    const SORT_STARTDATE = 2;

    const DISTANCE_DEFAULT = 20;

    public static function getAvailableSortDirections()
    {
        $thisClass = new ReflectionClass(__CLASS__);
        $classConstants = array_keys($thisClass->getConstants());

        $sortDirections = [];
        foreach ($classConstants as $constName) {
            if (0 === strpos($constName, 'SORT_')) {
                $sortDirections[] =  $thisClass->getConstant($constName);
            }
        }

        return $sortDirections;
    }
}

var_dump(MyClass::getAvailableSortDirections());

результат:

array (size=2)
  0 => int 1
  1 => int 2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.