自PHP7.0以来,foreach循环已被修改,并设置了一个新的行为,使引用比以前更快(foreach$tab为&$val(。
但我读过很多次,通过引用传递实际上有时比普通循环(foreach$tab为$val(慢
它总是更快吗?总是慢一点?这取决于我们在foreach循环中所做的事情吗?由于PHP中的引用不是引用,这很令人困惑。。。我有点厌倦了在网上阅读关于这个主题的不同答案,我不知道真相在哪里。
谢谢你给我们带来光明;(
来源:https://blog.eduonix.com/web-programming-tutorials/learn-changes-foreach-statement-php-7/来源:http://php.net/manual/fr/control-structures.foreach.php来源:http://php.net/manual/en/language.references.arent.php…
执行摘要:您担心的是不存在的性能问题。
详细信息
PHP使用"COW"(写时复制(。
正常通过($val
(:
- 标量—传递值。写入它只会更改本地副本
- Structure/array/etc—将指针传递给它。如果接收器(
foreach
循环或function
主体(想要更改结构的任何部分,则复制该结构。成本与结构的大小成正比
通过参考(&$val
(:
- 标量—传递一个指向标量的指针,以便内部可以实际更改它
- 结构--传递指针。如果接收器写入该结构,它只需(有效地(遍历指针即可到达该结构中的项。无COW
设计中的智慧是,99%的时间PHP"只是工作",和是高效的,用户不需要知道有两种传递技术。棘手的部分是,您需要了解何时执行&$val
。
PHP与几乎所有其他语言都有不同。
- ALGOL 60——通过值或"名称"传递(有点像新语言中的匿名函数(
- FORTRAN——仅通过"引用"(指针(传递。一个缺点是,如果您传递一个文本,接收器可以更改文本的值!(好吧,这是老编译器中的一个"bug"。(
- C——只传递值。但你可以(用语法(说,你想要指向这个东西的指针,然后在里面取消引用
- Pascal——值或引用,但与上面的任何内容都不相同(我忘记了细节(
"传递参数"的方法似乎和语言一样多。
返回问题:
- 如果您正在传递标量,则使用
&$val
并遍历指针可能会对性能造成很小的损失 - 如果您正在传递一个结构,而不需要对其进行写入,则可能没有任何差异
- 如果您正在传递一个结构,并且确实需要对其进行写入,那么您应该根据是否希望保留更改来决定如何传递它,而不是根据性能来决定而
语言设计人员只是试图处理数组元素大的情况,并直接在源代码中明确会发生什么。现在,您可以告诉PHP,变量$val
将包含对数组元素的引用,这意味着大值不会重复,内存垃圾收集器也不会有更多的工作要做,源代码清楚地表明了这一点。阅读此语句的后续程序员将确切地知道PHP将要做什么。
当然,引用自然比在内存中复制值更有效。