我注意到在PHP中extract(some_function());
的工作方式如下:
$stuff = some_function();
extract($stuff);
但是在PHP的文档中,extract函数参数前面有&
个东西,据我所知,这意味着你必须将一个变量传递给它。
答案 0 :(得分: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 :(得分:1)
&符号通过引用传递变量,这样当它在函数中使用时,您正在操作原始对象 - 而不是具有相同值的新变量。文档告诉您,如果将变量传递给提取函数,则原始对象可以通过该函数以某种方式更新。
所以,答案是肯定的,你需要将变量传递给该函数。
答案 2 :(得分:1)
$var_array
函数的extract
参数的原因是通过引用传递(最有可能)来自旧版PHP的保留。较新的版本通过引用自动传递数组。
extract
函数根据(可能很大的)数组的内容创建变量列表,不建议按值传递该类型的数据。
简而言之,将数组分配给变量并以这种方式传递。