通过 const 引用传递对象?

Posted

技术标签:

【中文标题】通过 const 引用传递对象?【英文标题】:Passing an object by const reference? 【发布时间】:2012-07-07 06:19:07 【问题描述】:

在 C++ 中,当您希望函数能够从对象中读取但不能修改它时,您可以将 const 引用传递给函数。在 php 中执行此操作的等效方法是什么?

我知道php5中的对象默认是通过引用传递的,但是为了可读性我想我会继续在变量名前使用&符号,像这样:

function foo(&$obj)



【问题讨论】:

【参考方案1】:

如果你想传递一个对象而不是引用,你可以事先clone这个对象。

<?php
function changeObject($obj) 
  $obj->name = 'Mike';


$obj = new StdClass;
$obj->name = 'John';

changeObject(clone $obj);
echo $obj->name; // John

changeObject($obj);
echo $obj->name; // Mike

我知道php5中的对象默认是通过引用传递的,但是为了可读性我想我会继续在变量名之前使用&符号

这是你的决定,但我发现这只会让它读起来更像 C++。或者,您可以通过在函数定义中使用类型提示来显示正在传入一个对象:

function foo(StdClass $obj)



一旦明确$obj 是一个对象,就可以假定它是通过引用传递的。

【讨论】:

这不会降低性能吗? (我有几十个对象,每个对象都需要独立传递给大约六个不同的函数) @Nate PHP 使用 copy-on-write 所以 AFAIK 除非您修改对象,否则不会浪费变量。 所以如果我事先用clone关键字传递对象,它会在不调用对象的构造函数的情况下复制对象吗?我必须写__clone() method吗? @Nate 它不会调用构造函数。 __clone() 方法是可选的。仅当您想在克隆对象时执行操作时才需要。

以上是关于通过 const 引用传递对象?的主要内容,如果未能解决你的问题,请参考以下文章

将const引用/指针传递给类进行存储的首选方法,而不是复制引用的对象

将 const 对象引用传递给仿函数

通过引用传递使用 const 有啥意义? C++ [重复]

按值传递比通过 const 引用传递更快的经验法则?

我应该通过 const 引用传递一个 lambda。

为啥向量被视为按值传递,即使它是通过 const 引用传递的?