通过常量引用传递对象?

Passing an object by const reference?

提问人:Nate 提问时间:7/7/2012 更新时间:7/7/2012 访问量:830

问:

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

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

function foo(&$obj)
{

}
PHP OOP 常量 按引用传递 值传递

评论


答:

3赞 Mike B 7/7/2012 #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

评论

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