Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP7中,在foreach中通过引用传递值真的对性能有用吗_Php_Performance_Loops_Foreach_Reference - Fatal编程技术网

在PHP7中,在foreach中通过引用传递值真的对性能有用吗

在PHP7中,在foreach中通过引用传递值真的对性能有用吗,php,performance,loops,foreach,reference,Php,Performance,Loops,Foreach,Reference,自PHP7.0以来,对foreach循环进行了修改,并设置了一个新的行为以使引用比以前更快(foreach$tab为&$val) 但我已经读过很多次,通过引用传递实际上有时比公共循环(foreach$tab作为$val)慢 总是更快吗?总是比较慢吗?它是否取决于我们在foreach循环中所做的工作?因为PHP中的引用不是引用,所以很混乱。。。我有点厌倦了在网上阅读关于这个问题的不同答案,我不知道真相在哪里 谢谢你给我们带来了光明;) 资料来源: 资料来源: 资料来源: 语言设计人员只是试图处理数

自PHP7.0以来,对foreach循环进行了修改,并设置了一个新的行为以使引用比以前更快(foreach$tab为&$val)

但我已经读过很多次,通过引用传递实际上有时比公共循环(foreach$tab作为$val)慢

总是更快吗?总是比较慢吗?它是否取决于我们在foreach循环中所做的工作?因为PHP中的引用不是引用,所以很混乱。。。我有点厌倦了在网上阅读关于这个问题的不同答案,我不知道真相在哪里

谢谢你给我们带来了光明;)

资料来源: 资料来源: 资料来源:
语言设计人员只是试图处理数组元素较大的情况,并在源代码中直接阐明将要发生的事情。现在,您可以告诉PHP,变量
$val
,将包含对数组元素的引用,这意味着大值不会被复制,内存垃圾收集器也不会有更多的工作要做,源代码清楚地说明了这一点。阅读此语句的后续程序员将确切地知道PHP将要做什么


当然,引用自然比在内存中复制值更有效。

执行摘要:您担心的是一个不存在的性能问题

详细信息

PHP使用“COW”(写时复制)

正常传球(
$val
):

  • 标量——传递值。写入它只会更改本地副本
  • Structure/array/etc——将指针传递给它。如果接收器(
    foreach
    loop或
    function
    body)想要更改结构的任何部分,则复制该结构。成本与结构的大小成正比
通过引用传递(
和$val
):

  • 标量——传递一个指向标量的指针,以便内部可以实际更改它
  • 结构——传递指针。如果接收器写入结构,它只(有效地)通过指针到达结构中的项。没有奶牛
设计中的智慧是,99%的时间PHP“正常工作”,而且效率很高,用户不需要知道有两种传递技术。棘手的部分是,您需要了解何时执行
&$val
操作

PHP与几乎所有其他语言都不同

  • ALGOL 60——传递值或“名称”(有点像新语言中的匿名函数)
  • FORTRAN——仅通过“引用”(指针)传递。缺点是,如果传递一个文本,接收方可以更改该文本的值!(好吧,这是老编译器中的一个“bug”。)
  • C——只传递值。但是你可以说(用语法)你想要指向这个东西的指针,然后在里面取消引用
  • Pascal——值或引用,但与上面的任何内容都不相同(我忘记了细节)
似乎“传递参数”的方法几乎和语言一样多

回到问题:

  • 如果传递的是标量,则使用
    和$val
    并遍历指针,可能会有微小的性能损失
  • 如果您正在传递一个结构,而不需要对其进行写入,则可能没有差异
  • 如果您正在传递一个结构,并且确实需要对其进行写入,那么您应该根据是否希望保留更改而不是性能来决定如何传递它