Есть ли способ легко решить эту проблему, или мне действительно нужно переписать весь старый код?
Неустранимая ошибка PHP: удалена ссылка на время вызова в ... в строке 30
Это происходит везде, когда переменные передаются в функции в виде ссылок по всему коду.
Ответы:
Вы должны обозначать вызов по ссылке в определении функции, а не фактический вызов. Поскольку PHP начал показывать ошибки устаревания в версии 5.3, я бы сказал, что было бы неплохо переписать код.
Из документации :
Например, вместо использования:
Использование:
источник
E_COMPILE_WARNING
ошибку уровня, для справки: php.net/manual/en/…Для тех, кто, как и я, читает это, потому что им нужно обновить гигантский унаследованный проект до 5.6: как показывают ответы здесь, быстрого решения не существует: вам действительно нужно найти каждое возникновение проблемы вручную и устранить ее. ,
Самый удобный способ, который я нашел, - найти все проблемные строки в проекте (если не использовать полнофункциональный статический анализатор кода, который очень точен, но я не знаю ни одного, который сразу же приведет вас к правильному положению в редакторе) использовала код Visual Studio, в который встроен красивый PHP-линтер, и функцию поиска, которая позволяет выполнять поиск по Regex. (Конечно, для этого вы можете использовать любой редактор IDE / Code, который выполняет PHP-линнинг и поиск в Regex.)
Используя это регулярное выражение:
можно выполнить поиск по всему проекту
&$
только в тех строках, которые не являются определением функции.Это все еще вызывает много ложных срабатываний, но облегчает работу.
Браузер результатов поиска VSCode упрощает просмотр и нахождение оскорбительных строк: вы просто нажимаете на каждый результат и высматриваете те, которые выделены красной линией. Те, что вам нужно исправить.
источник
(?<!function)[:> ][a-zA-Z0-9_]+(?<!foreach|array)\s?\([^()]*&\$
PHP и ссылки несколько не интуитивно понятны. При правильном использовании ссылки в нужных местах могут обеспечить значительное повышение производительности или избежать очень уродливых обходных путей и необычного кода.
Следующее приведет к ошибке:
Ни один из них не должен потерпеть неудачу, поскольку они могли следовать приведенным ниже правилам, но, без сомнения, были удалены или отключены, чтобы избежать путаницы в наследство.
Если они действительно работали, оба включали избыточное преобразование в ссылку, а второе также включало избыточное преобразование обратно в переменную, содержащуюся в области.
Второе раньше было возможно, позволяя передавать ссылку на код, который не предназначен для работы со ссылками. Это крайне уродливо для ремонтопригодности.
Это ничего не будет делать:
Более конкретно, он превращает ссылку обратно в обычную переменную, поскольку вы не запрашивали ссылку.
Это будет работать:
Это означает, что вы передаете не-ссылку, но хотите ссылку, поэтому превращает ее в ссылку.
Это означает, что вы не можете передать ссылку на функцию, для которой ссылка явно не запрашивается, чтобы сделать ее одной из немногих областей, где PHP строг в отношении передачи типов или, в данном случае, в большей степени мета-типа.
Если вам нужно более динамичное поведение, это будет работать:
Здесь он видит, что вы хотите ссылку и уже есть ссылка, поэтому оставляет его в покое. Это может также связать ссылку, но я сомневаюсь в этом.
источник