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

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

define('MY_CONSTANT', 42);

echo "This is my constant: MY_CONSTANT";

Ответ 1

Нет.

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

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

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

Ответ 2

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

define('FOO', 'bar');

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

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

Ответ 3

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

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 )}" ); 

Имейте в виду

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

Ответ 4

define( 'FOO', 'bar');  
$FOO = FOO;  
$string = "I am too lazy to concatenate $FOO in my string";

Ответ 5

define('FOO', 'bar');
$constants = create_function('$a', 'return $a;');
echo "Hello, my name is {$constants(FOO)}";

Ответ 6

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

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

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

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

ИЗМЕНИТЬ

Также, если вы считаете строки конкатенировать, строки проходов как параметры или пишите целые строки с помощью, , > (comma version) всегда быстрее, затем идет . (конкатенация с ' одинарные кавычки), а самый медленный метод построения строк - это двойные кавычки ", потому что выражения, написанные таким образом, должны быть оценены против объявленных переменных и функций.

Ответ 7

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

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']}";

Ответ 8

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

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

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

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

Ответ 9

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

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 );

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

Ответ 10

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

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;

Ответ 11

Приятно, что вы можете использовать ключевое слово '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;};

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

Ответ 12

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

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

Вывод:

DB_USER=root