Динамическое имя константы в PHP

Я пытаюсь динамически создать постоянное имя, а затем получить значение.

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 по-прежнему содержит ИМЯ константы, а не ЗНАЧЕНИЕ.

Я также попробовал второй уровень косвенности $$constant_name Но это сделало бы его переменной, а не константой.

Может ли кто-нибудь пролить свет на это?


person vikmalhotra    schedule 22.10.2010    source источник


Ответы (3)


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

echo constant($constant_name);
person Mads Lee Jensen    schedule 22.10.2010

И чтобы продемонстрировать, что это работает и с константами класса:

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

$command = "HELLO";
echo constant("Joshua::SAY_$command");
person uɥƃnɐʌuop    schedule 27.02.2013
comment
Стоит отметить, что вам может потребоваться указать полное имя класса (в пространстве имен), если константа находится в классе, который не находится в текущем пространстве имен, независимо от того, добавили ли вы использование для класса в своем файле. - person lopsided; 25.08.2014
comment
Этот ответ великолепен из-за хорошего примера. Это именно то, что я искал :) Спасибо! - person ElChupacabra; 31.12.2015
comment
@lopside Константа ::class может использоваться для получения полного пространства имен, например: constant(YourClass::class . '::CONSTANT_' . $yourVariable); - person Willem-Aart; 27.08.2017
comment
Обратите внимание, что ::classключевое слово доступен начиная с php 5.5 - person T30; 11.01.2018

Чтобы использовать динамические имена констант в вашем классе, вы можете использовать функцию отражения (начиная с 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
person Dado    schedule 18.02.2015