PHP Call Time Pass Ссылка - PullRequest
0 голосов
/ 30 марта 2010

Что такое ссылка на время прохождения вызова? Что это делает?

Ответы [ 5 ]

3 голосов
/ 20 февраля 2011

Проблема, не позволяющая мне использовать ссылку на время вызова, состоит в том, что я не могу изменить объявление встроенных функций php, я использовал много ссылок на время вызова для встроенных функций, я точно знаю, что это за функции делаю, и я знаю, что никаких неприятностей не произойдет, мне нужно использовать эту функцию, и я не могу переписать эти функции, кроме того, не всегда мне нужно, чтобы она передавалась по ссылке, она нужна мне в определенных ситуациях, например:

$rows[] = array_map('array_shift', &$data);

вместо того, чтобы делать оператор foreach, я экономлю время и строки кодирования, выполняя array_map с и смещение массива в качестве обратного вызова, проблема в том (я не знаю, является ли это ошибкой), что array_shift не получить мой массив по ссылке (я думаю, это потому, что ссылка работает только для 1 уровня, если вы получаете ссылочное значение и выбрасываете его на другую функцию, которая не получает по ссылке, она теряет ссылку, я бы хотел, чтобы у php были реальные указатели, а не это ссылка), поэтому мне нужно передать массив по ссылке во время вызова.

Другой пример

new ArrayObject(&$_POST, ArrayObject::ARRAY_AS_PROPS)

Я хочу my $_POST как объект массива, но если я сбрасываю что-то, я хочу, чтобы это происходило на реальном $_POST, и поэтому я мог бы делать с $_SESSION и $_GET, я знаю, что я делая в этом случае, и если это плохая практика, я не вижу проблемы с этим, вместо того, чтобы делать это, я должен был создать свой собственный объект, который получил массив по ссылке, я потерял некоторое время с этим ....

Дело в том, что любой язык позволяет передавать указатели на функции, которые не были предназначены для получения указателей, может быть, это плохая практика, но решать мне, не так ли?

Эта функция не должна быть устаревшей.

1 голос
/ 30 марта 2010

Полагаю, вы имеете в виду время прохождения вызова Под Ссылка.

В PHP оператор & получит ссылку на переменную (об этом имеется много информации о stackoverflow)

Время вызова передача по ссылке - это когда вы передаете ссылку в качестве аргумента функции, которая не принимает ссылку

function foo($myParam){
}

//Call Time Pass By Reference
foo(&$myArg);

Это выдаст предупреждение в PHP 5.3, так как оно устарело и будет передано по значению. Правильный способ сделать это состоит в том, чтобы изменить функцию foo для получения ссылки

function foo(&$myParam){
}

foo($myArg); //myArg is passed by reference

Возможность предварительно передать время вызова по заданию контролируется настройкой ini

allow_call_time_pass_reference

В более поздних выпусках по умолчанию это отключено.

Причина, по которой это плохо, заключается в том, что функция (и читатель) не знает, какие параметры являются ссылками, а какие нет. Это усложняет выполнение кода.

0 голосов
/ 19 мая 2013

В PHP 5.3.x мы получали предупреждение о том, что время вызова по ссылке устарело.
Но обратите внимание, что в PHP 5.4.0 использование передачи по вызову по ссылке является фатальной ошибкой.

Примечание: при вызове функции нет знака ссылки - только для функции определения. Одних только определений функций достаточно для правильной передачи аргумент по ссылке. Начиная с PHP 5.3.0 вы получите предупреждение говоря, что "передача по времени вызова по ссылке" устарела, когда вы используете & в foo (& $ a) ;. Начиная с PHP 5.4.0, время передачи по ссылке было удалено, поэтому его использование приведет к фатальной ошибке.

0 голосов
/ 30 марта 2010

В PHP, когда вы передаете значение в функцию, оно копируется для использования функцией, поэтому вне функции значение остается неизменным. Это называется передачей по значению. Если вы хотите изменить значение внутри функции, вы должны сделать передачу по ссылке (передать указатель на значение, а не на само значение). В PHP это делается с помощью символа &.

$a = 1;

function b($a) {
    $a + 1;
    echo $a;
}

echo $a; // print 1
echo b($a); // print 2
echo $a; // $a is still 1
echo b(& $a); // print 2
echo $a; // $a is now 2

Если вы хотите передать ссылку, у вас есть два способа сделать это в PHP, и один из них (время вызова) устарел.

Время разговора по ссылке:

b(& $a);

Вместо этого вы должны изменить объявление функции и добавить туда &.

// declare reference parameter
function b(& $a) {
    ...
}

b($a); // pass by reference
0 голосов
/ 30 марта 2010

Руководство по PHP объясняет это:

В настоящее время ссылки объявляются с помощью объявления функции следующим образом:

function foo (&$bar) {
  // changing $bar changes the original variable
}

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

foo(&$bar);

и , что устарело, поскольку считается плохим стилем и подвержено ошибкам. (Если функция не знает, действует ли она на копию или на исходную переменную, вы можете подумать о любом происшествии.)

Последний называется время вызова по ссылке , так как ссылка передается во время вызова функции. (Хм ... Первое правило тавтологического клуба - это первое правило тавтологического клуба.)

...