Включить константу в строку без конкатенации

Есть ли способ в PHP включить константу в строку без конкатенации?

define('MY_CONSTANT', 42); echo "This is my constant: MY_CONSTANT"; 

Нет.

С помощью String PHP не может передавать строковые данные, кроме постоянных идентификаторов. Это относится к любому из строковых форматов в PHP, включая heredoc.

constant() является альтернативным способом получения константы, но вызов функции не может быть помещен в строку без конкатенации.

Руководство по константам в PHP

Да, это (в некотором роде;)):

 define('FOO', 'bar'); $test_string = sprintf('This is a %s test string', FOO); 

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

Чтобы использовать константы внутри строк, вы можете использовать следующий метод:

 define( 'ANIMAL', 'turtles' ); $constant = 'constant'; echo "I like {$constant('ANIMAL')}"; 


Как это работает?

Вы можете использовать любое имя строковой функции и произвольные параметры

Можно поместить любое имя функции в переменную и вызвать ее с параметрами внутри строки с двумя кавычками. Работает с несколькими параметрами.

 $fn = 'substr'; echo "I like {$fn('turtles!', 0, -1)}"; 

Производит

мне нравятся черепахи

Анонимные функции тоже

Вы также можете использовать анонимные функции при запуске PHP 5.3+.

 $escape = function ( $string ) { return htmlspecialchars( (string) $string, ENT_QUOTES, 'utf-8' ); }; $userText = "<script>alert('xss')</script>"; echo( "You entered {$escape( $userText )}" ); 

Производит правильно экранированный html, как и ожидалось.

Массивы обратного вызова не допускаются!

Если к настоящему времени у вас создается впечатление, что имя функции может быть любым вызываемым, это не так, поскольку массив, который возвращает true при передаче в is_callable , приведет к фатальной ошибке при использовании внутри строки:

 class Arr { public static function get( $array, $key, $default = null ) { return is_array( $array ) && array_key_exists( $key, $array ) ? $array[$key] : $default; } } $fn = array( 'Arr', 'get' ); var_dump( is_callable( $fn ) ); // outputs TRUE // following line throws Fatal error "Function name must be a string" echo( "asd {$fn( array( 1 ), 0 )}" ); 

Иметь ввиду

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

 define( 'FOO', 'bar'); $FOO = FOO; $string = "I am too lazy to concatenate $FOO in my string"; 
 define('FOO', 'bar'); $constants = create_function('$a', 'return $a;'); echo "Hello, my name is {$constants(FOO)}"; 

Если вы действительно хотите эхо-константу без конкатенации, то это решение:

 define('MY_CONST', 300); echo 'here: ', MY_CONST, ' is a number'; 

note : в этом примере echo принимает несколько параметров ( посмотрите на запятые ), поэтому это не настоящая конкатенация

Echo ведет себя как функция, он принимает больше параметров, он более эффективен, чем конкатенация, потому что он не должен конкатенироваться, а затем эхо, он просто отгоняет все, не создавая новый конкатенированный объект String :))

РЕДАКТИРОВАТЬ

Кроме того, если вы считаете, что конкатенация строк, строки проходов в качестве параметров или запись целых строк с помощью « , (,), всегда самая быстрая, следующая идет (конкатенация с « одинарными кавычками ») и самый медленный метод построения строк использует двойные кавычки » , потому что выражения, написанные таким образом, должны быть оценены против объявленных переменных и функций.

Вы можете сделать:

 define( 'FOO', 'bar' ); $constants = get_defined_constants(true); // the true argument categorizes the constants $constants = $constants[ 'user' ]; // this gets only user-defined constants echo "Hello, my name is {$constants['FOO']}"; 

Как указывали другие, вы не можете этого сделать. PHP имеет функцию constant() которая не может быть вызвана непосредственно в строке, но мы можем легко обойти это.

 $constant = function($cons){ return constant($cons); }; 

и базовый пример его использования:

 define('FOO', 'Hello World!'); echo "The string says {$constant('FOO')}"; 

Ниже приведены некоторые альтернативы другим ответам, которые, по-видимому, сосредоточены главным образом на трюке «{$}». Хотя на их скорости нет гарантий; это весь чистый синтаксический сахар. Для этих примеров мы предположим, что набор констант ниже был определен.

 define( 'BREAD', 'bread' ); define( 'EGGS', 'eggs' ); define( 'MILK', 'milk' ); 

Использование extract ()
Это хорошо, потому что результат идентичен переменным. Сначала вы создаете функцию многократного использования:

 function constants(){ return array_change_key_case( get_defined_constants( true )[ 'user' ] ); } 

Затем вызовите его из любой области:

 extract( constants() ); $s = "I need to buy $bread, $eggs, and $milk from the store."; 

Здесь он уменьшает константы, чтобы быть проще на ваших пальцах, но вы можете удалить array_change_key_case (), чтобы сохранить их как есть. Если у вас уже есть конфликтующие имена локальных переменных, константы не будут переопределять их.

Использование замены строк
Это похоже на sprintf (), но использует единственный токен замены и принимает неограниченное количество аргументов. Я уверен, что есть лучшие способы сделать это, но простите мою неуклюжесть и попытайтесь сосредоточиться на идее этого.

Как и раньше, вы создаете функцию многократного использования:

 function fill(){ $arr = func_get_args(); $s = $arr[ 0 ]; array_shift( $arr ); while( strpos( $s, '/' ) !== false ){ $s = implode( current( $arr ), explode( '/', $s, 2 ) ); next( $arr ); } return $s; } 

Затем вызовите его из любой области:

 $s = fill( 'I need to buy /, /, and / from the store.', BREAD, EGGS, MILK ); 

Вы можете использовать любой заменяющий токен, например,% или #. Я использовал косую черту, потому что ее немного легче набирать.

Самый простой способ –

 define('MY_CONSTANT', 42); $my_constant = MY_CONSTANT; echo "This is my constant: $my_constant"; 

Другой способ использования (s)printf

 define('MY_CONSTANT', 42); // Note that %d is for numeric values. Use %s when constant is a string printf('This is my constant: %d', MY_CONSTANT); // Or if you want to use the string. $my_string = sprintf('This is my constant: %d', MY_CONSTANT); echo $my_string; 

Приятно, что вы можете использовать ключевое слово «const» в качестве имени вашей функции, чтобы предотвратить засоривание пространства имен:

 define("FOO","foo"); ${'const'} = function($a){return $a;}; echo "{$const(FOO)}"; // Prints "foo" echo const(FOO); // Parse error: syntax error, unexpected T_CONST 

Вы также можете использовать $ GLOBALS для распространения функции «const» по всему коду:

 $GLOBALS['const'] = function($a){return $a;}; 

Не уверен, что это безопасно для будущего использования. И что еще хуже – это все еще выглядит уродливо.

Я считаю, что это отвечает первоначальному вопросу OP. Единственное, что ключ индекса globals, похоже, работает только в нижнем регистре.

 define('DB_USER','root'); echo "DB_USER=$GLOBALS[db_user]"; 

Вывод:

 DB_USER=root