使用PHP确实将byref var分配给另一个var分配引用或复制值?

时间:2016-03-13 18:54:03

标签: php byref

以我正在处理的项目中的这个抽象类为例。 (减去所有真正有趣的部分)。

abstract class col_meta extends meta {

    protected $col_obj;

    public function inject_object(&$obj);

    public function &get_object(){
        return $this->col_obj;
    }
}

我理解inject_object方法接收$obj作为参考,但如果我希望类将其分配给受保护变量,我是否需要再次通过引用分配?

像这样:

class foo extends col_meta {

    public function inject_object(&$obj){
        $this->col_obj = &$obj;
    }

}

或者,只是给了一个引用,我是否需要简单地将引用复制到受保护的变量中?

class bar extends col_meta {

    public function inject_object(&$obj){
        $this->col_obj = $obj;
    }

}

我一直在试图解决这个问题,因为他们看起来都是正确的。

1 个答案:

答案 0 :(得分:1)

根据定义,引用是“通过引用”;这意味着如果在函数中更改了值,则会在调用脚本中更改它。

但是 - 因为它提供了更好的性能 - 如果你传递“by value”,PHP仍会将引用传递给函数,但如果更改函数中的值,则会创建一个副本(按值)。

请注意,对象总是有效地“按引用传递”,因为对象变量实际上是指向对象的指针,因此对函数内部对象的任何更改也将反映在函数外部。

除非您明确希望在函数内部更改的变量也在函数外部更改,否则不要通过引用传递。

如果你想在你的类中复制一个对象,而不是引用;然后使用clone创建副本。