Есть ли способ в 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