通过引用将对象传递给类构造函数 - 混淆了行为

时间:2014-07-17 12:51:02

标签: php object pass-by-reference

我最近一直在处理旧项目并稍微升级它们。我构造了类似下面的代码:

class Foo{

    public $some_variable = "AAA";

    public function do_some_action(){

        echo $this->some_variable;
        // Prints out 'AAA'

        $bar = new Bar($this);
        $bar->different_action();

        echo $this->some_variable;
        // Prints out 'BBB' - why ?      

    }
} class Bar {

    //Constructor
    public function Bar($foo){
        $this->foo = $foo;
    }

    public function different_action(){
        $this->foo->some_variable = "BBB";
    }

}

我不完全理解为什么函数Bar :: different_action()会影响Foo的公共变量。是>> $ this<<在这种情况下总是作为参考传递?我期待某种参考,例如:

public function Bar(&$foo){
            $this->foo =& $foo;
}

我的逻辑确实失败了,但如果有人告诉我在哪里以及为什么,我会很感激。)

3 个答案:

答案 0 :(得分:0)

Bar的构造函数参数没有&,因此按值传递。仅当参数具有&时才能通过引用传递。

传递值意味着函数获取值的单独副本,并且在被调用函数中指定参数(在本例中,构造函数中为$foo = something)不会影响调用者。但是,由于此情况下的值是对象指针,因此可以使用它来调用指向对象的方法,该方法可以更改对象的状态。

如果您了解C ++,这里相当于C ++中的代码,保留代码和每一行的结构,并根据C ++中的要求添加类型:

class Foo{
  public:
    string some_variable = "AAA";

    void do_some_action(){

        cout << this->some_variable;
        // Prints out 'AAA'

        Bar *bar = new Bar(this);
        bar->different_action();

        cout << this->some_variable;
        // Prints out 'BBB' - why ?      

    }
} class Bar {
    Foo *foo;
  public:
    //Constructor
    Bar(Foo *foo){
        this->foo = foo;
    }

    void different_action(){
        this->foo->some_variable = "BBB";
    }

}

在这个C ++代码中,没有通过引用传递。 (仅当参数具有&时,它才会在C ++中通过引用传递,就像在PHP中一样。)你能看出为什么对象被改变了吗?

通过引用传递对象指针,就像在上一个代码示例中一样,仅在您想要分配参数时才有用,从而更改调用范围中的对象指针变量(但$this是无论如何都不可分配,所以在这种情况下它是没有意义的。)

答案 1 :(得分:-1)

通过引用传递对象: 文档:http://php.net/manual/en/language.oop5.references.php

答案 2 :(得分:-1)

在PHP中,所有对象都通过引用传递。要通过引用传递的所有其他变量都需要在函数/方法参数前面加上&符号(& - 引用运算符)。

function some_action(&$variable) {
   $variable = 'new value';
}

$variable = 'string';

some_action($variable); // $variable now has a new value. Passing objects to this function will always pass them by reference - automatically.