Я пытаюсь уменьшить предупреждения , которые отправляются в мой журнал сервера apache.
Одно предупреждение:
Переадресация по времени вызова устарела.
Мне трудно представить, почему это было устаревшим, поскольку это такая полезная функция программирования, в основном я это делаю:
public function takeScriptsWithMarker(&$lines, $marker) { ... }
и я вызываю эту функцию, неоднократно получая результаты от нее и обрабатывая их, но также позволяя создавать массивы $ lines, повторно отправляясь в этот метод.
Таким образом, поскольку вызов по ссылке устарел, что такое «принятый способ» для достижения функциональности этого шаблона: а именно для отправки массива строк в метод, чтобы они были изменены методом, а затем продолжали использовать этот метод массив?
На самом деле, нет никакой проблемы с тем, как вы определяете функцию. Это проблема с тем, как вы вызываете эту функцию. Итак, для вашего примера, вместо того, чтобы называть его:
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);