строчная интерполяция с константами в php [duplicate]

, если вы отправляете переменную из PHP, вы можете получить ее с этим перед отправкой:

$string=nl2br($string);
133
задан silkfire 3 August 2013 в 20:42
поделиться

12 ответов

Нет.

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

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

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

121
ответ дан Mat 23 August 2018 в 01:55
поделиться
  • 1
    +1 в любом случае, поскольку это, несомненно, правильный ответ. Сначала я хотел написать то же, что и вы, но, прочитав, я подумал, что должен представить что-то другое;) – Felix Kling 5 February 2010 в 00:30
  • 2
    Хехе! Но хорошо заслужил +1 для всех за творчество. :) – Pekka 웃 5 February 2010 в 00:38
  • 3
    & quot; вызов функции не может быть помещен в строку & quot; да это может: define('ANIMAL','turtles'); $constant='constant'; echo "I like {$constant('ANIMAL')}"; – raveren 27 April 2012 в 15:49
  • 4
    @Raveren, в то время как другие предлагают косвенные вариации, излишне создавая функции, ваше - это самое короткое и точечное решение, которое опирается на переменные функции, недооцененную и очень редко используемую функцию PHP. Из всей этой темы я пошел с ВАШИМ конкретным решением. Мне жаль, что я не мог +1 больше одного раза. – Raine 14 March 2014 в 01:30
  • 5
    Я просто отметил, что это возможно, а не прокомментировал, какой путь лучше. – raveren 14 July 2014 в 11:12

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

define('FOO', 'bar');

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

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

90
ответ дан Felix Kling 23 August 2018 в 01:55
поделиться

Вы могли бы сделать:

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']}";
11
ответ дан arlomedia 23 August 2018 в 01:55
поделиться

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

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

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

1
ответ дан Dom 23 August 2018 в 01:55
поделиться

Я считаю, что это отвечает первоначальному вопросу OP.

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

Выход:

DB_USER=root
Выходной сигнал:

DB_USER=root
-2
ответ дан FattyPotatoes 23 August 2018 в 01:55
поделиться

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

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;
1
ответ дан Jekis 23 August 2018 в 01:55
поделиться
  • 1
    Я считаю это хорошим решением. В некоторых случаях соединительная строка не будет работать, если вы используете прямую CONSTANT внутри. – kta 1 May 2017 в 21:26

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

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

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

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

EDIT

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

11
ответ дан Juraj Blahunka 23 August 2018 в 01:55
поделиться
define( 'FOO', 'bar');  
$FOO = FOO;  
$string = "I am too lazy to concatenate $FOO in my string";
17
ответ дан Macswork 23 August 2018 в 01:55
поделиться
  • 1
    Это тот, который я использую больше всего, когда у меня есть куча сумасшедших строк SQL для составления. Также ... пассивно-агрессивный? ;-) – Beejor 5 June 2015 в 03:23
  • 2
    У этого есть наименьшее количество волшебства, за счет того, что он выглядит излишним – BrDaHa 29 June 2017 в 01:36

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

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

Имейте в виду

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

47
ответ дан raveren 23 August 2018 в 01:55
поделиться
  • 1
    Это отличный трюк! Как и другие ответы, на самом деле не большая победа над конкатенацией с точки зрения усилий и удобочитаемости, но приятно знать. Это даже более сексуально, когда вы делаете что-то вроде $_ = create_function('$a','return $a;'); $s = "I like {$_(ANIMAL)}". Версия Thetaiko устраняет необходимость в котировках, а символ подчеркивания - симпатичный. – Beejor 5 June 2015 в 01:12
  • 2
    Я мог видеть, что это полезно для создания механизма шаблонов, но кажется, что это слишком сложно использовать. – Mnebuerquo 20 April 2016 в 15:48
define('FOO', 'bar');
$constants = create_function('$a', 'return $a;');
echo "Hello, my name is {$constants(FOO)}";
13
ответ дан thetaiko 23 August 2018 в 01:55
поделиться

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

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

0
ответ дан user619271 23 August 2018 в 01:55
поделиться

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

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

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

define('FOO', 'Hello World!');
echo "The string says {$constant('FOO')}"; 
5
ответ дан Yamiko 23 August 2018 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: