Подтвердить что ты не робот

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

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

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

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

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

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

    ...
}

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

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

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

4b9b3361

Ответ 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);