PHP: Как объединить ссылку на строковую переменную? - PullRequest
3 голосов
/ 10 апреля 2011

В следующем фрагменте PHP $phrases должен отражать изменения, сделанные в $greeting.Как этого достичь?

$greeting = "Hello!";

$phrases = array('greeting' => $greeting . " Glad to see you.");
echo $phrases['greeting'];

Hello! Glad to see you.

$greeting = "How are you?";
echo $phrases['greeting'];

Hello! Glad to see you.

Обратите внимание, что даже после$greeting переменная изменена, массив остался неизменным (что обычно является ожидаемым поведением, так как значение $greeting var передается по значению).

Чтобы изменить массив, я попыталсяиспользовать ссылки на переменные, но они, кажется, не работают с оператором конкатенации ..

Спасибо, если кто-нибудь может предложить быстрое решение этой проблемы ..

Ответы [ 5 ]

2 голосов
/ 10 апреля 2011

Наиболее распространенный способ добавления заполнителей в строки: printf ()

$phrases = array('greeting' => "%s Glad to see you.");

$greeting = "Hello!";
printf($phrases['greeting'],$greeting);
$greeting = "How are you?";
printf($phrases['greeting'],$greeting);
0 голосов
/ 27 января 2017

Несколько лет спустя .. Вы можете достичь того же с:

$greeting = "Hello!";

$phrases = array('greeting' => function() use (&$greeting) {
                return $greeting." Glad to see you.";
            });

echo call_user_func($phrases['greeting']);

$greeting = "Oh NOOO!";
echo call_user_func($phrases['greeting']);
0 голосов
/ 10 апреля 2011

Вы пытаетесь создать динамическую строковую переменную, что невозможно в php.

Вам необходимо использовать функцию.

Хранится метод, который, вероятно, ближе всего к вашему кодукак массив со ссылкой и использованием implode:

$greeting = "Hello!";

$phrases = array(&$greeting," Glad to see you.");
echo implode($phrases);

$greeting = "Hi!";
echo implode($phrases);

Редактировать: удалены два других возможных метода

0 голосов
/ 10 апреля 2011

То есть, вы хотите, чтобы ваше значение в массиве $pharses изменялось при каждом изменении значения $greeting?Это невозможно, поскольку при создании строки создается «строковый объект», то есть ссылка на определенную часть в памяти, значение которой жестко закодировано и никогда не будет изменено.

Выпришлось бы написать функцию, например

function getPhrase(which) {
   // do concatenation using $greeting
}

, которую нужно вызывать всякий раз, когда вы хотите вывести фразу.

0 голосов
/ 10 апреля 2011

Легко, используйте &.

Пример:

$a = 'a';
$b = array(&$a);
$a = 'b';
print_r($b);

Печать:

Array ([0] => b)

Редактировать : Вы не можете использовать & -symbol при объединении строк. Вы должны переопределить всю переменную или использовать printf или что-то еще (но я рекомендую переопределить всю переменную.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...