Динамический доступ к константам класса в PHP

Я хочу иметь возможность динамически искать значение константы, но использование переменной не работает с синтаксисом.

<?php
class Food {
    const FRUITS = 'apple, banana, orange';
    const VEGETABLES = 'spinach, carrot, celery';
}

$type = 'FRUITS';

echo Food::FRUITS;
echo Food::$type;

?>

дает

apple, banana, orange

Fatal error: Access to undeclared static property: Food::$type

Как я могу динамически вызывать константу?


person jcropp    schedule 16.01.2018    source источник
comment
Я полагаю, вы не можете.   -  person u_mulder    schedule 16.01.2018


Ответы (4)


Единственное решение, которое приходит мне в голову, это использование функции constant:

echo constant('Food::' . $type);

Здесь вы создаете имя константы, включая класс, в виде строки и передаете эту строку ('Food::FRUITS') в функцию constant.

person u_mulder    schedule 16.01.2018
comment
Да. Использование ReflectionClass для получения массива всех констант — это еще один способ программного поиска значения. Я надеялся, что есть какой-то неясный синтаксис для захвата значения с помощью одного оператора/действия. - person jcropp; 17.01.2018

ReflectionClass можно использовать для получения массива всех констант, а затем оттуда можно найти значение конкретной константы:

<?php
class Food {
    const FRUITS = 'apple, banana, orange';
    const VEGETABLES = 'spinach, carrot, celery';
}

$type = 'FRUITS';

$refClass = new ReflectionClass('Food');
$constants = $refClass->getConstants();

echo $constants[$type];

?>
person jcropp    schedule 16.01.2018

При использовании пространств имен убедитесь, что вы включили пространство имен, даже если оно загружается автоматически.

namespace YourNamespace;

class YourClass {
  public const HELLO = 'WORLD'; 
}

$yourConstant = 'HELLO';

// Not working
// >> PHP Warning:  constant(): Couldn't find constant YourClass::HELLO ..
constant('YourClass::' . $yourConstant);

// Working
constant('YourNamespace\YourClass::' . $yourConstant);```
person Michaël Vaes    schedule 23.06.2020

вы можете создать ассоциативный массив

class Constants{
  const Food = [
      "FRUITS " => 'apple, banana, orange',
      "VEGETABLES" => 'spinach, carrot, celery'
  ];
}

и получить доступ к такому значению

$type = "FRUITS";

echo Constants::Food[$type];
person Keval Dholakiya    schedule 01.07.2020