php5函数参数是作为引用传递还是作为副本传递?

时间:2010-07-02 13:04:49

标签: php oop parameter-passing pass-by-reference

Php函数参数是作为对象的引用传递还是作为对象的副本传递?

在C ++中非常清楚但在Php5中我不知道。

示例:

<?php
$dom = new MyDocumentHTMLDom();
myFun($dom);

参数$dom是作为参考传递还是作为副本传递?

6 个答案:

答案 0 :(得分:9)

在PHP5中,对象通过引用传递。好吧,不完全是技术方面,因为它是一个副本 - 但PHP5中的对象变量存储对象 IDENTIFIER ,而不是对象本身,所以基本上它与通过引用传递相同。

更多信息: http://www.php.net/manual/en/language.oop5.references.php

答案 1 :(得分:1)

复制,除非您在函数声明中指定&$dom,否则

更新

在OP中,示例是一个对象。我的回答很简短。 TomaszStruczyński提供了一个很好的,更详细的答案。

答案 2 :(得分:1)

对象始终通过引用传递,因此对函数中对象所做的任何修改都会反映在原始

Scalars通过引用传递。但是,如果您修改代码中的标量变量,那么PHP将采用本地副本并对其进行修改...除非您明确使用了&amp;指示函数定义中的引用传递,在这种情况下修改为原始

答案 3 :(得分:1)

在PHP5中,对象的默认值是通过引用传递。

以下是一篇强调这一点的博文:http://mjtsai.com/blog/2004/07/15/php-5-object-references/

答案 4 :(得分:0)

在php5对象中通过引用传递,在php4及更早版本中 - 通过值(复制)通过php4中的引用传递,您必须在对象名称之前设置&

答案 5 :(得分:0)

它与函数参数无关。 PHP 5只有指向对象的指针;它没有“对象”作为值。因此,您的代码在C ++中与此相同:

MyDocumentHTMLDom *dom = new MyDocumentHTMLDom;
myFun(dom);

现在,很多人提到按值传递或通过引用传递。你没有在问题中提出这个问题,但是由于人们提到它,我会谈论它。就像在C ++中一样(因为你提到你知道C ++),传递值或按引用传递取决于函数的声明方式。

当且仅当函数声明中包含&时,参数才会通过引用传递:

function myFun(&$dom) { ... }

就像在C ++中一样:

void myFun(MyDocumentHTMLDom *&dom) { ... }

如果没有,则按值传递:

function myFun($dom) { ... }

就像在C ++中一样:

void myFun(MyDocumentHTMLDom *dom) { ... }