12 ответов:
нет.
со строками PHP не может отличить строковые данные от постоянных идентификаторов. Это касается любого из строковых форматов в PHP, включая heredoc.
constant()- это альтернативный способ получить константу, но вызов функции также не может быть помещен в строку без конкатенации.
Да, это (в некотором роде ;) ):
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'); $constants = create_function('$a', 'return $a;'); echo "Hello, my name is {$constants(FOO)}";
Если вы действительно хотите Эхо константа без конкатенации вот решение:
define('MY_CONST', 300); echo 'here: ', MY_CONST, ' is a number';Примечание: в этом примере Echo принимает ряд параметров (смотреть на запятые), Так что это не реальный конкатенации
Echo ведет себя как функция, она принимает больше параметров, она более эффективна, чем конкатенация, потому что ей не нужно конкатенировать, а затем Эхо, она просто повторяет все без необходимости создавать новые String concatenated object:))
редактировать
и если вы считаете объединения строки, передавая строки как параметры или писать все строки с " на , (запятая версия) всегда быстрее, далее идет . (конкатенация с ' одинарные кавычки) и самый медленный метод построения строк использует двойные кавычки ", потому что выражения, написанные таким образом должны быть оценены по объявленным переменным и функциям..
вы могли бы сделать:
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)printfdefine('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;};Не уверен, что это безопасно для будущего использования. И что еще хуже - это все равно выглядит некрасиво.
Я считаю, что это отвечает на исходный вопрос ОП. Единственное, что ключ индекса globals, похоже, работает только в нижнем регистре.
define('DB_USER','root'); echo "DB_USER=$GLOBALS[db_user]";выход:
DB_USER=root
Comments