Как избежать устаревшей ошибки времени вызова в PHP?
Я пытаюсь уменьшить предупреждения, которые отправляются в мой журнал сервера apache.
Одно предупреждение:
Переадресация вызова по времени устарела.
Мне трудно представить, почему это было устаревшим, поскольку это такая полезная функция программирования, в основном я это делаю:
public function takeScriptsWithMarker(&$lines, $marker) {
...
}
и я вызываю эту функцию, повторно получая результаты от нее и обрабатывая их, но также позволяя создавать массивы $lines, повторно отправляясь в этот метод.
- Для перепрограммирования это будет обширным.
- Я не хочу просто "отключать предупреждения", так как хочу увидеть другие предупреждения.
Итак, поскольку вызов по ссылке устарел, , что является "принятым способом" для достижения функциональности этого шаблона: а именно отправки массива строк в метод, пусть они будут изменен методом, а затем продолжает использовать этот массив?
Ответы
Ответ 1
На самом деле нет проблем с тем, как вы определяете функцию. Это проблема с тем, как вы вызываете эту функцию. Итак, для вашего примера, вместо того, чтобы называть его:
takeScriptsWithMarker(&$lines, $marker);
Вы бы назвали это так:
takeScriptsWithMarker($lines, $marker); // no ampersands :)
Таким образом, функция все еще доступна. Но я не знаю причины этого изменения.
Ответ 2
как указано выше в предыдущем ответе, проблема заключается в времени CALL, а не в определении времени. Таким образом, вы можете определить функцию как:
function foo(&$var1,$var2,$var3=null){
// procesing here
}
затем вызовите как:
$return = foo($invar1,$invar2);
ваш первый инвариант передается по ссылке, второй - нет.
появляется ошибка при попытке вызвать так:
$return = foo(&$invar1,$invar2);
Ответ 3
Вы можете установить allow_call_time_pass_reference
в true
в свой php.ini
файл. Но это взломать.
Ответ 4
Вы можете передать массив со ссылкой в:
public function takeScriptsWithMarker(array(&$lines, $marker))
который должен взять только небольшое количество рефакторинга на другом конце.
Ответ 5
Вы можете передать массив, позволить ему манипулировать им, а затем "вернуть" его, вместо того, чтобы возиться с исходной ссылкой. Не нужно слишком просто включать возврат и назначение.
public function takeScriptsWithMarker($lines, $marker) {
//...
return $lines;
}
Использование:
$lines = takeScriptsWithMarker($lines, $marker);