Могу ли я извлечь возвращаемое значение функции? - PullRequest
4 голосов
/ 20 ноября 2011

Я заметил, что в PHP extract(some_function()); будет работать так же, как:

$stuff = some_function();
extract($stuff);

Но в документации PHP аргумент функции extract имеет перед собой &, что, как я знаю, означаетВы должны передать ему переменную.

Ответы [ 3 ]

4 голосов
/ 20 ноября 2011

Если документация верна, это приведет к появлению сообщения о строгих стандартах:

Строгие стандарты PHP: только переменные должны передаваться по ссылке

Так что я думаю, что вы только что нашли ошибку в документации. Поздравляю.

EDIT

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

~❯ php -a
Interactive shell

php > function a(){return array('pwet'=> 42);}
php > extract(a(), EXTR_REFS);
php > echo $pwet;
42

Что странно, потому что ссылки на переменные, определенные внутри функции, не имеют большого смысла для меня. Я думаю, что & могло быть введено из-за этой опции, но появляется только в документе и не применяется в коде.

EDIT

Кажется, я прав, я нашел этот комментарий в ext/standard/array.c (ветки 5.3 и 5.4):

/* var_array is passed by ref for the needs of EXTR_REFS (needs to
 * work on the original array to create refs to its members)
 * simulate pass_by_value if EXTR_REFS is not used */
1 голос
/ 20 ноября 2011

Причина, по которой параметр $var_array функции extract передается по ссылке (скорее всего), связана с более ранними версиями PHP. Более новые версии автоматически передают массивы по ссылке.

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

Короче говоря, присвойте свой массив переменной и передайте его таким образом.

1 голос
/ 20 ноября 2011

Амперсанд передает переменную по ссылке, поэтому, когда она используется в функции, вы манипулируете исходным объектом, а не новой переменной с тем же значением.В документации говорится, что если вы передадите переменную в функцию извлечения, то эта функция может каким-то образом обновить исходный объект.

Итак, ответ - да, вам нужно передатьэта функция.

...