【问题标题】:Are primitive data types in PHP passed by reference?PHP中的原始数据类型是通过引用传递的吗?
【发布时间】:2023-03-22 03:30:01
【问题描述】:

在 PHP 中,我经常做大量的字符串操作。是否可以将我的代码拆分为多个函数,因为如果像字符串这样的原始类型按值传递,我会显着影响性能。

【问题讨论】:

    标签: php performance byref


    【解决方案1】:

    只有对象通过引用传递。

    这并不意味着您可以通过更改引用来提高性能 - PHP 使用写时复制,因此只有在您修改变量时才会进行复制。

    从这个角度来看,将代码拆分为函数不会减慢速度。 调用函数的开销很小,但除非您在循环中调用 10,000 个函数,否则您可能不需要担心。

    【讨论】:

    • 对象不是通过引用传递的。对象是引用类型,但除非您另外指定,否则它们作为函数参数按值传递。
    • 它们在技术上不是通过引用传递但足够接近。从 PHP 5 开始就是这样 - PHP 4 不同。
    【解决方案2】:

    对象通过引用传递。除非您明确使用pass-by-reference with the & operator,否则其他所有内容均按值传递。

    话虽如此,PHP 也使用copy-on-write 来避免不必要的复制。

    【讨论】:

      【解决方案3】:

      是的,原语是按值传递的,除非您明确定义要通过引用传递的函数(通过在参数前面使用与符号&)或在参数前面使用与符号调用函数。 (后者已弃用)

      请参阅this part of the documentation 了解更多信息。

      编辑

      此外,PHP 中“对象通过引用传递”的声明有点简化,尽管在大多数情况下通常可以这样认为。这个chapter of the documentation 解释了这些差异。

      【讨论】:

        【解决方案4】:

        在 PHP 中按引用传递实际上比按值传递要慢。我找不到此声明的正确引用;它位于 PHP 手册的“参考”部分。

        【讨论】:

          【解决方案5】:

          默认情况下,一切都是按值传递的。如果您想通过引用传递某些内容,则必须明确说明。

          这里是php documentation that explicitly states this behavior

          【讨论】:

            猜你喜欢
            • 2011-05-18
            • 2011-04-09
            • 1970-01-01
            • 2015-02-22
            • 2011-06-03
            • 2013-04-25
            • 1970-01-01
            • 1970-01-01
            • 2011-05-06
            相关资源
            最近更新 更多