2011-11-20 84 views
4

我注意到,在PHP extract(some_function());将工作就像:我可以提取函数返回值吗?

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

但PHP的文档中提取函数参数在前面的&啄,从我所知道的,这意味着你必须通过一个变量它。

+0

+1 for&thingy ...但是到底是什么问题? –

回答

4

如果文件是正确的,这将产生一个严格的标准消息:

PHP严格的标准:只有变量应该按引用传递

所以我认为你只是发现了一个错误的文档。恭喜。

编辑

它仍然如果你EXTR_REFS使用它作为第二个参数不抱怨:

~❯ php -a 
Interactive shell 

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

这很奇怪,因为引用函数中定义的变量并没有多大感觉到我。我认为&可能是由于此选项而引入的,但仅出现在文档中,并未在代码中强制执行。

编辑

看来我是对的,我发现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

&符通过引用传递变量,以便在函数中使用它时,您正在操作原始对象 - 而不是具有相同值的新变量。该文档告诉你,如果你将一个变量传递给提取函数,那么可以通过该函数以某种方式更新原始对象。

所以,答案是肯定的,你需要将一个变量传递给该函数。

+0

虽然我很想知道它是如何改变的,因为'extract()'的文档没有提及它,而且似乎没有必要。 – Wiseguy

+0

它可能不会被改变......这取决于被调用的函数。但是,通过引用传递变量应该要求该变量在传递给另一个函数之前存在于该范围中,而不是作为返回值,因为可能发生许多不好的事情,例如垃圾回收返回值。 –

1

extract功能的原因$var_array参数是按引用传递(很可能)来自旧版本的PHP。较新的版本通过引用自动传递数组。

extract函数根据(可能较大的)数组的内容创建一个变量列表,并且不建议该类型的数据按值传递。

长话短说,将你的数组赋值给一个变量并以这种方式传递它。

+1

什么?新的PHP版本通过引用自动传递数组? – NikiC

相关问题