Как избежать ошибки перехода по ссылке во время вызова в PHP? - PullRequest
29 голосов
/ 29 июня 2009

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

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

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

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

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

    ...
}

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

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

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

Ответы [ 5 ]

51 голосов
/ 29 июня 2009

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

takeScriptsWithMarker(&$lines, $marker);

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

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

Так что функция все еще доступна. Но я не знаю причину этого изменения.

9 голосов
/ 30 июня 2009

, как отмечалось выше в предыдущем ответе, проблема возникает во время ВЫЗОВА, а не во время определения ... поэтому вы можете определить функцию как:

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

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

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

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

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

$return = foo(&$invar1,$invar2);
6 голосов
/ 29 июня 2009

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

1 голос
/ 07 июля 2009

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

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

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

0 голосов
/ 29 июня 2009

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

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

Использование:

$lines = takeScriptsWithMarker($lines, $marker);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...