2010-09-04 2 views
4

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

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

выходы: Какова будет ценность {CONST_TEST}?

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

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

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

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

+2

Если он не работает, значит, он не работает. Решите его, изменив исходный код PHP и перекомпилировав его. :-) –

+0

Даже менее разборчиво, если '{CONST_TEST}' находится внутри строки. Скорее используйте конкатенацию. –

+0

stereofrog: Да, PHP полон хакерских функций, приятный синтаксис и программирование «что-вы-мысли» - вы будете удивлены! – NikiC

ответ

4

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

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

Спасибо за объяснение, я думал, что php разрешит все внутри фигурных скобок .. но я вижу, что работает только для $ переменных. – aland

+0

Да. Он будет работать только для чего-то, начиная с $. Например. '{Class :: static}' тоже не работает :( – NikiC

2

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

define('CONST_TEST','Some string'); 
$def=CONST_TEST; 
echo "What is the value of $def going to be?"; 
+4

Я не думал, что у меня была большая суета, просто любопытство :) – aland

+0

В моем случае я сгенерировал файлы со всеми именами столбцов и таблиц базы данных в качестве константы класса. В настоящее время я должен создать отдельную переменную для каждой константы в каждой функции, которую я использую. Это то, что я делаю, но это очень скучно –

0

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

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

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

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

$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 вместо $ ПОСТОЯННЫХ;)

Надежда, что помогает , Scott

Смежные вопросы