Есть ли способ в PHP включить константу в строку без конкатенации?
define('MY_CONSTANT', 42);
echo "This is my constant: MY_CONSTANT";
Есть ли способ в PHP включить константу в строку без конкатенации?
define('MY_CONSTANT', 42);
echo "This is my constant: MY_CONSTANT";
Нет.
С помощью Strings 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');
$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 объекта:))
ИЗМЕНИТЬ
Также, если вы считаете строки конкатенировать, строки проходов как параметры или пишите целые строки с помощью, , > (comma version) всегда быстрее, затем идет . (конкатенация с ' одинарные кавычки), а самый медленный метод построения строк - это двойные кавычки ", потому что выражения, написанные таким образом, должны быть оценены против объявленных переменных и функций.
Вы можете сделать:
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