Примечание. Только ссылочные строки 53 должны передаваться только переменные, а строка 65 [дублировать]

Если, как и я, вы пытались расположить элемент над другим элементом, плавающий элемент должен находиться внутри другого, а не как братьев и сестер. Теперь ваша позиция: absolute; может работать!

203
задан hakre 26 April 2013 в 22:55
поделиться

3 ответа

Вы должны указывать вызов по ссылке в определении функции, а не на фактический вызов. Поскольку PHP начал показывать ошибки устаревания в версии 5.3, я бы сказал, что было бы неплохо переписать код.

Из документации :

В вызове функции нет ссылочного знака - только для определения функций. Определений функций достаточно, чтобы правильно передать аргумент по ссылке. Начиная с PHP 5.3.0 вы получите предупреждение о том, что «call-by-reference-ссылка» устарела, когда вы используете & в foo(&$a);.

Например , вместо использования:

// Wrong way!
myFunc(&$arg);               # Deprecated pass-by-reference argument
function myFunc($arg) { }

Использование:

// Right way!
myFunc($var);                # pass-by-value argument
function myFunc(&$arg) { }
321
ответ дан Saad 16 August 2018 в 14:15
поделиться
  • 1
    Слишком плохо :( - Я портирую с 5.2 до 5.4, и это действительно раздражает ... – bardiir 23 January 2012 в 14:40
  • 2
    Начиная с PHP 5.0.0, это время, дающее ошибку уровня E_COMPILE_WARNING, для справки: php.net/manual/en/… – hakre 28 June 2012 в 23:20
  • 3
    У меня была эта ошибка, но мне нужно было удалить & amp; вместо добавления к переменной. – Diana 26 February 2013 в 02:47
  • 4
    Я использовал это в старом коде для объекта, называемого event (& amp; $ event), и ему пришлось удалить амперсанд, чтобы сообщение об ошибке исчезло. – Natalia 16 November 2013 в 19:21
  • 5
    для людей в комментариях обратите внимание, что удаление & amp; может привести к неожиданным результатам, так как любые изменения в переменной больше не будут использоваться совместно, но будут видны только для локальной области функций. Поэтому, если вы не знаете, что делает код, я бы рекомендовал его исправить, как описано выше, а не просто удалить & amp; персонаж – xorinzor 16 September 2015 в 07:26

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

Следующее приведет к ошибке:

 function f(&$v){$v = true;}
 f(&$v);

 function f($v){$v = true;}
 f(&$v);

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

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

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

Это ничего не сделает:

 function f($v){$v = true;}
 $r = &$v;
 f($r);

В частности, он возвращает ссылку обратно в обычную переменную, поскольку вы не запрашивали ссылку.

Это будет работать:

 function f(&$v){$v = true;}
 f($v);

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

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

Если вам нужно больше динамического поведения, это будет работать:

 function f(&$v){$v = true;}
 $v = array(false,false,false);
 $r = &$v[1];
 f($r);

Здесь он видит, что вы хотите ссылку и уже имеете ссылку, поэтому оставите ее в покое. Он может также связывать ссылку, но я в этом сомневаюсь.

5
ответ дан jgmjgm 16 August 2018 в 14:15
поделиться

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

Самый удобный способ найти все проблемные строки в проекте (не используя полномасштабный статический анализатор кода, который очень точен, но я не знаю никого, что приведет вас к правильному позиция в редакторе сразу) использовала Visual Studio Code, в которой есть хороший PHP-интерфейс, и его функция поиска, которая позволяет искать в Regex. (Конечно, вы можете использовать любой редактор IDE / Code для этого, который выполняет поиск PHP и поиск в Regex.)

С помощью этого регулярного выражения:

^(?!.*function).*(\&\$)

можно выполнить поиск проекта для всей сети &$ только в строках, которые не являются определением функции.

Это все еще вызывает много ложных срабатываний, но это облегчает работу.

Браузер результатов поиска VSCode делает прохождение и поиск оскорбительных линий очень просто: вы просто щелкните через каждый результат, и обратите внимание на те, которые linter подчеркивает красный. Те, которые вам нужно исправить.

4
ответ дан Pekka 웃 16 August 2018 в 14:15
поделиться
  • 1
    Это то, что я искал! – Sonny 2 February 2017 в 19:22
  • 2
    Более точное регулярное выражение, которое я использую для этой цели: (?<!function)[:> ][a-zA-Z0-9_]+(?<!foreach|array)\s?\([^()]*&\$ – Mojo 4 April 2017 в 06:45
Другие вопросы по тегам:

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