当前位置: 首页 > 面试题库 >

在PHP(> = 5.0)中,通过引用传递速度更快吗?

崔绍辉
2023-03-14
问题内容

在PHP中,可以通过在函数声明中的参数前面加上“&”号来通过引用传递函数参数,如下所示:

function foo(&$bar)
{
    // ...
}

现在,我知道这 不是 为了提高性能 设计的,而是允许函数更改通常不在其范围内的变量。

取而代之的是,PHP似乎使用写时复制来避免在对象被更改之前复制对象(也许还有数组)。因此,对于不更改其参数的函数,效果应与您通过引用传递它们的效果相同。

但是,我想知道写时复制逻辑是否可能在传递引用时短路,并且这是否会对性能产生影响。

ETA:可以肯定的是,我认为它并不快,而且我很清楚这不是引用的目的。
所以我想我自己的猜测很好,我是在寻找一个真正知道内幕下肯定会发生什么的人的答案。在PHP开发的五年中,我总是发现很难通过阅读源代码获得有关PHP内部构件的质量信息。


问题答案:

ZendEngine使用写时复制,当您自己使用引用时,会产生一些额外的开销。但是,仅在撰写本文时才能找到此提及,并且手册中的注释包含其他链接。

(编辑)关于对象和引用的手册页包含有关对象变量与引用如何不同的更多信息。



 类似资料:
  • 问题内容: 我真的是Swift的新手,我刚刚读到类是通过引用传递的,并且复制了数组/字符串等。 通过引用进行传递是否与在Objective-C或Java中通过“ a”引用进行传递的方式相同,还是通过引用进行正确传递? 问题答案: Swift中的事物类型 规则是: 类实例是 引用类型 (即, 您 对类实例的引用实际上是一个 指针 ) 函数是参考类型 其他一切都是 价值类型 ; “其他所有内容”仅表示

  • 问题内容: 我有以下代码: 有人可以解释为什么输出是:零一二二。 摘自zend认证学习指南。 问题答案: 因为在第二个循环中,仍然是对最后一个数组项的引用,所以每次都将其覆盖。 您可以看到这样的内容: 如您所见,最后一个数组项采用当前循环值:“零”,“一个”,“两个”,然后就是“两个” …:)

  • 问题内容: 我想知道在您仅读取变量时是否将其作为按引用传递的优良作法,还是应始终将其作为值传递。 引用传递示例: 传递值的示例: 哪个更好 ?例如,如果我要循环运行1000次? 循环示例: 问题答案: 如果您打算传递一个 值 (因此该函数不会对其进行修改) ,则没有理由通过引用传递它:这只会使您的代码更难以理解,因为人们会认为“ 此函数可以修改我将要修改的内容。传递给它-哦,它没有修改? ” 在您

  • 问题内容: 在PHP 5中,是否需要使用修饰符通过引用传递?例如, 在PHP4中,您需要使用修饰符在进行更改后保持引用,但是我对已阅读的有关PHP5自动使用传递引用的主题感到困惑,除非明确克隆对象。 在PHP5中,是否 需要通过修饰符来通过引用传递所有类型的对象(变量,类,数组等)? 问题答案: 您是否需要使用&修饰符来传递引用? 从技术上/意义上讲,即使有对象,答案也是 肯定的 。这是因为有两种

  • 问题内容: 这两个代码有什么区别: 代码A: 哪里 VS. 代码B: 这两个代码之间有什么区别吗? 问题答案: Java始终按值传递参数,而不按引用传递参数。 让我通过一个例子解释一下: 我将逐步解释这一点: 声明一个名为ftype 的引用,Foo并将其分配给Foo具有属性的type的新对象”f”。 从方法方面,声明Foo具有名称的类型引用,a并将其初始分配给null。 调用方法时changeRe

  • 问题内容: Go中的地图是否通过值或引用传递? 始终可以将函数定义为以下形式,但这是一个过大的杀伤力吗? 相同的返回值问题。我应该返回指向地图的指针,还是将地图作为值返回? 这样做的目的当然是避免不必要的数据复制。 问题答案: 在此线程中,您将找到答案: Golang:使用地图参考来访问地图 您不需要在地图上使用指针。 映射类型是引用类型,例如指针或切片[1] 如果需要更改会话,可以使用一个指针: