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

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

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

function foo(&$obj)
{

}

【问题讨论】:

    标签: php oop constants pass-by-reference pass-by-value


    【解决方案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() 方法是可选的。仅当您想在克隆对象时执行操作时才需要。
    猜你喜欢
    • 2013-11-24
    • 2012-09-06
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2017-09-11
    相关资源
    最近更新 更多