Как использовать константы со сложным (фигурным) синтаксисом? - PullRequest
6 голосов
/ 04 сентября 2010

Я был удивлен, увидев, что следующее не работает должным образом.

define('CONST_TEST','Some string');
echo "What is the value of {CONST_TEST} going to be?";

output: Какое значение {CONST_TEST} будет?

Есть лиспособ разрешения констант в фигурных скобках?

Да, я знаю, что могу просто сделать

echo "What is the value of ".CONST_TEST." going to be?";

, но я бы предпочел не объединять строки, не столько для производительности, сколько для читабельности.

Ответы [ 4 ]

5 голосов
/ 04 сентября 2010

Нет, это невозможно, потому что php будет рассматривать CONST_TEST как простую строку внутри одинарных / двойных кавычек.Для этого вам нужно будет использовать сцепление .

echo "What is the value of ".CONST_TEST." going to be?";
2 голосов
/ 04 сентября 2010

Я не понимаю, почему вы должны делать из этого большую суету, но вы всегда можете сделать:

define('CONST_TEST','Some string');
$def=CONST_TEST;
echo "What is the value of $def going to be?";
1 голос
/ 24 октября 2012

Если вы очень сильно хотели эту функцию, вы могли бы написать небольшой код, используя relfection, который находит все константы и их значения.Затем устанавливает их в переменную типа $ CONSTANTS ['CONSTANT_NAME'] ... это будет означать, что если вы когда-нибудь захотите поместить константу в строку, вы можете использовать {}.Кроме того, вместо того, чтобы добавлять их в $ CONSTANTS, сделайте его классом, реализующим доступ к массиву, чтобы вы могли гарантировать, что значения в нем не могут быть изменены каким-либо образом (только новые элементы добавляются к объекту, к которому можно обращаться как к массиву).

Таким образом, его использование будет выглядеть следующим образом:

$CONSTANTS = new constant_collection();

//this bit would normally be automatically populate using reflection to find all the constants... but just for demo purposes, here is what would and wouldn't be allowed.
$CONSTANTS['PI'] = 3.14;
$CONSTANTS['PI'] = 4.34; //triggers an error
unset($CONSTANTS['PI']); //triggers an error
foreach ($CONSTANTS as $name=>$value) {
    .... only if the correct interface methods are implemented to allow this
}
print count($CONSTANTS); //only if the countable interface is implemented to allow this

print "PI is {$CONSTANTS['PI']}"; //works fine :D

Чтобы сделать так, чтобы у вас было всего несколько дополнительных символов для ввода, вы можете просто использовать $ C вместо $ CONSTANTS;)

Надеюсь, это поможет, Скотт

1 голос
/ 16 апреля 2011

Это может быть невозможно, но поскольку ваша цель - удобочитаемость, вы можете использовать sprintf / printf для достижения лучшей читаемости, чем с помощью конкатенации строк.

define('CONST_TEST','Some string');
printf("What is the value of %s going to be?", CONST_TEST);
...