PHP5 对象是通过引用传递的吗?

php
2022-08-30 09:06:58

我似乎无法获得任何一致的信息。不同的消息来源似乎说了不同的事情,而古老的 php.net 本身(似乎)并没有明确说明这一点 - 尽管,我必须承认,我只是快速浏览了一下。

在我传递“重”对象的情况下,我需要通过引用传递,但我不想继续键入:

function foo(TypeName& $obj)

如果我能逃脱简单

function foo(TypeName $obj)

那么标准是怎么说的呢?


答案 1

对象通过引用传递(和分配)。无需使用运营商的地址。

当然,我键入的内容过于简单,但适合您的目的。文档指出:

PHP5 OOP经常提到的一个关键点是“默认情况下,对象是通过引用传递的”。这并不完全正确。本节通过一些例子纠正了这种普遍的想法。

PHP 引用是一个别名,它允许两个不同的变量写入相同的值。从 PHP5 开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,该标识符允许对象访问器查找实际对象。当一个对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们保存指向同一对象的标识符的副本。

有关更详细的解释(解释过度简化以及标识符),请查看此答案


答案 2

PHP 手册中可以看出:

您可以通过引用函数来传递变量,以便该函数可以修改该变量。语法如下:

<?php
function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
// $a is 6 here
?>

注意:函数调用上没有引用符号 - 仅在函数定义上。仅函数定义就足以通过引用正确传递参数。从 PHP 5.3.0 开始,您将收到一条警告,指出当您在 foo(&$a) 中使用 & 时,“调用时间通过引用传递”已被弃用。

PHP5 中的新增功能中可以看出

在 PHP 5 中,对象模型的基础结构被重写为使用对象句柄。除非使用 clone 关键字显式克隆对象,否则永远不会在后台创建对象的副本。在 PHP 5 中,既不需要通过引用传递对象,也不需要通过引用来分配对象

因此,您唯一需要使用语法的时间是$var可能不是类的实例。function foo(&$var)


推荐