Как избежать устаревшей ошибки времени вызова в PHP?

Я пытаюсь уменьшить предупреждения , которые отправляются в мой журнал сервера apache.

Одно предупреждение:

Переадресация по времени вызова устарела.

Мне трудно представить, почему это было устаревшим, поскольку это такая полезная функция программирования, в основном я это делаю:

public function takeScriptsWithMarker(&$lines, $marker) { ... } 

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

  1. Перепрограммировать это было бы обширно.
  2. Я не хочу просто «отключать предупреждения», так как хочу видеть другие предупреждения.

Таким образом, поскольку вызов по ссылке устарел, что такое «принятый способ» для достижения функциональности этого шаблона: а именно для отправки массива строк в метод, чтобы они были изменены методом, а затем продолжали использовать этот метод массив?

На самом деле, нет никакой проблемы с тем, как вы определяете функцию. Это проблема с тем, как вы вызываете эту функцию. Итак, для вашего примера, вместо того, чтобы называть его:

 takeScriptsWithMarker(&$lines, $marker); 

Вы бы назвали это так:

 takeScriptsWithMarker($lines, $marker); // no ampersands :) 

Таким образом, функция по-прежнему доступна. Но я не знаю причины этого изменения.

как указано выше в предыдущем ответе, проблема заключается в времени CALL, а не в определении времени. Таким образом, вы можете определить функцию как:

 function foo(&$var1,$var2,$var3=null){ // procesing here } 

затем позвоните как:

 $return = foo($invar1,$invar2); 

ваш первый инвариант передается по ссылке, второй – нет.

ошибка появляется при попытке вызвать так:

 $return = foo(&$invar1,$invar2); 

Вы можете установить allow_call_time_pass_reference в true в файле php.ini . Но это взломать.

Вы можете передать массив со ссылкой в:

 public function takeScriptsWithMarker(array(&$lines, $marker)) 

на другом конце которого требуется лишь небольшое количество рефакторинга.

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

 public function takeScriptsWithMarker($lines, $marker) { //... return $lines; } 

Применение:

 $lines = takeScriptsWithMarker($lines, $marker);