Php函数参数是作为对象的引用传递还是作为对象的副本传递?
在C ++中非常清楚但在Php5中我不知道。
示例:
<?php
$dom = new MyDocumentHTMLDom();
myFun($dom);
参数$dom
是作为参考传递还是作为副本传递?
答案 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) { ... }