Alex
Alex

Reputation: 68104

Can I extract function return value?

I noticed that in PHP extract(some_function()); will work just like:

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

But in the PHP's documentation the extract function argument has the & thingy in front, and from what I know that means you have to pass a variable to it.

Upvotes: 4

Views: 972

Answers (3)

greg0ire
greg0ire

Reputation: 23255

If the documentation was right, this would produce a strict standards message:

PHP Strict standards: Only variables should be passed by reference

So I think you just found a bug in the documentation. Congratulations.

EDIT

It still doesn't complain if you use it with EXTR_REFS as a second argument:

~❯ php -a
Interactive shell

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

Which is strange because referencing variables defined inside a function doesn't make much sense to me. I think the & might have been introduced because of this option, but appears only in the doc and is not enforced in the code.

EDIT

It seems I'm right, I found this comment in ext/standard/array.c (branches 5.3 and 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 */

Upvotes: 4

Jim H.
Jim H.

Reputation: 5579

The reason $var_array parameter of the extract function is passed by reference (most likely) is from a holdover from older versions of PHP. Newer versions automatically pass arrays by reference.

The extract function creates a variable list from the contents of a (potentially large) array and it is not recommended that data of that type be passed by value.

Long story short, assign your array to a variable and pass it in that way.

Upvotes: 1

Scott Harwell
Scott Harwell

Reputation: 7465

The ampersand passes a variable by reference so that when it is used in a function, you are manipulating the original object -- not a new variable with the same value. The documentation is telling you that if you pass a variable to the extract function, then the original object can be updated in some fashion by that function.

So, the answer is yes, you need to pass a variable to that function.

Upvotes: 1

Related Questions