【问题标题】:Why does extract() work with functions?为什么 extract() 与函数一起工作?
【发布时间】:2012-12-15 19:41:45
【问题描述】:

extract(some_function_that_returns_array());

工作正常。

但是在 php.net 上它说第一个参数必须是一个引用变量:http://php.net/manual/en/function.extract.php。是不是搞错了?


所以
function foo(&$array){}

function lol(){ $arr = array(); return $arr; }

foo(lol());

显示“严格标准:只有变量应该在...中通过引用传递”

extract 不会发生这种情况

【问题讨论】:

  • 请将此视为错误并报告。一个相关的错误可能是:bugs.php.net/bug.php?id=55222 一个相关的问题可能是:stackoverflow.com/q/6726589/367456
  • 好吧,我并不关心它,但它表明手册不可信 :P 如果die() 杀死我们而不是脚本怎么办? :(
  • 哈哈,放轻松。你不能总是相信文档。顺便说一句,无论信任意味着什么,我想这个小缺陷不会杀死你,对吧?如果您不在乎,请不要问。
  • 如果您认为文档中的某些内容可以改进,我们鼓励大家进行修复:edit.php.net/?project=PHP
  • 这里有一些相关的 bugs.php.net/bug.php?id=55754(它解释了一个 zend 引擎标志 - 并向我们展示了 zend 引擎所做的“首选引用”和“需要引用”的区别)

标签: php arrays extract


【解决方案1】:

文档错误或函数错误。老实说,我无法理解为什么 extract 需要通过引用传递数组,但有人指出了 EXTR_REFS 提取类型标志。

查看我本地版本的PHP代码(5.3.2),可以看到extract()的函数定义并没有表示引用传递。

function extract (array $var_array, $extract_type = null, $prefix = null)

查看sort() 的定义确实显示通过引用传递:

function sort (array &$array, $sort_flags = null)

这就是为什么我在extract() 上没有收到严格错误,而我在sort() 上看到了它。

我假设 php.net 上的文档已经过时或完全错误。 extract() 是一只老小狗...我不确定在过去的函数定义是否实际上指示了&$var_array

另一个选项是函数定义在某些时候搞砸了,文档正确地指出了它应该是怎样的,基于有一个额外的类型标志 EXTR_REFS 这可能是这种情况(这个常量仍然存在)。

【讨论】:

  • 这是不正确的。仅仅因为调用时传递引用在 5.3 中被弃用并在 5.4 中被删除并不意味着您不能再通过引用传递 vars。与OP的问题完全无关。
  • @igorw 这是正确的。引用传递是通过函数的定义实现的,调用函数时不指定。
  • 这个答案与问题无关。 OP 根本没有询问通话时间。
  • @Ray,这个问题的正确答案可以用来解释extract(lol())sort(lol()) 之间的行为差​​异——不同之处在于它们中只有一个会触发php 通知
  • @iputonmyrobeanwizardhat 好的,我更新了我的答案。这个问题与他原来的帖子不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2010-10-28
  • 2021-04-29
  • 2015-03-16
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
相关资源
最近更新 更多