Я бы хотел сделать что-то вроде этого:
class ThingIDs
{
const Something = 1;
const AnotherThing = 2;
}
$thing = 'Something';
$id = ThingIDs::$thing;
Это не работает. Есть ли простой способ сделать что-то эквивалентное? Обратите внимание, что я застрял в классе; это в библиотеке, которую я не могу переписать. Я пишу код, который принимает аргументы в командной строке, и мне бы очень хотелось, чтобы он принимал символические имена вместо номеров идентификаторов.
ThingIDs::{$thing}
?Ответы:
$id = constant("ThingIDs::$thing");
http://php.net/manual/en/function.constant.php
источник
defined("ThingIDs::$thing");
$id = constant(sprintf('%s::%s', ThingIDs::class, $thing));
use
в верхней части файла, а затем использование::class
метода волшебного получения полного доменного имени улучшает читаемость.Использовать отражение
источник
Если вы используете пространства имен, вы должны включить пространство имен с классом.
источник
источник
Вспомогательная функция
Вы можете использовать такую функцию:
Требуется два аргумента:
Если передается экземпляр объекта, выводится имя его класса. Если вы используете PHP 7, вы можете использовать
::class
для передачи соответствующего имени класса, не думая о пространствах имен.Примеры
источник
Если у вас есть ссылка на сам класс, вы можете сделать следующее:
источник
Моя проблема была похожа на эту тему. Когда у вас есть объект, но нет имени класса, вы можете использовать:
источник