PHP: только переменные могут быть переданы по ссылке

Я получаю эту ошибку в строке 57: $password = str_replace($key, $value, $password, 1);

Насколько я могу судить, я передаю только переменные. Вот еще контекст:

$replace_count = 0;
foreach($replacables as $key => $value)
{
    if($replace_count >= 2)
        break;
    if(strpos($password, $key) !== false)
    {
        $password = str_replace($key, $value, $password, 1);
        $replace_count++;
    }

}

person Edward Yu    schedule 24.06.2013    source источник
comment
str_replace может принимать массив .. вам не нужно зацикливаться   -  person Baba    schedule 24.06.2013
comment
Из мануала: Если пройдено, будет установлено количество выполненных замен. Это означает, что функция обновляет значение четвертого параметра. Вам нужно просто указать имя переменной в качестве ссылки.   -  person user1402647    schedule 24.06.2013
comment
возможный дубликат PHP: ... переменные могут быть переданы по ссылке в str_replace()?   -  person T.Todua    schedule 19.11.2014


Ответы (2)


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

Изменять:

$password = str_replace($key, $value, $password, 1);

to:

$var = 1
$password = str_replace($key, $value, $password, $var);

ОБНОВЛЕНИЕ: Изменено объявление переменной вне вызова метода из отзывов в комментариях.

person immulatin    schedule 24.06.2013
comment
str_replace($key, $value, $password, $var = 1); тоже неверно, используйте str_replace($key, $value, $password, $var);. иначе вы получите Strict Standards: Only variables should be passed by reference in...... - person bystwn22; 24.06.2013
comment
@bystwn22 bystwn22 Спасибо, у меня нет этих настроек локально, поэтому я бы никогда не увидел эту ошибку. я обновил ответ - person immulatin; 24.06.2013

Проходить 1 нет смысла. (Почему бы не передать 42 или -5?) Четвертый параметр str_replace используется только для передачи вам информации. Функция не использует исходное значение переменной вообще. Итак, какой смысл (даже если это разрешено) передавать что-то, если оно не используется, и вы не собираетесь использовать новое значение, отправленное вам обратно? Этот параметр является необязательным; просто вообще ничего не пропускай.

person newacct    schedule 25.06.2013
comment
Именно, это распространенная ошибка полагать, что 4-й аргумент должен установить номер замены. Как говорит документ: count: If passed, this will be set to the number of replacements performed. - person Erdal G.; 02.11.2014