【问题标题】:Passing an object to a class contructor by reference - confused about behavior通过引用将对象传递给类构造函数 - 对行为感到困惑
【发布时间】:2014-09-08 08:37:36
【问题描述】:

我最近一直在处理较旧的项目并对其进行了一些升级。我已经构建了类似于下面的代码:

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;
}

我的逻辑肯定失败了,但如果有人告诉我在哪里以及为什么,我将不胜感激:)

【问题讨论】:

  • 对象通过引用传递。
  • 谢谢 - 这可能看起来很简单,但我不知道!
  • 接受我的回答将是您的好心
  • 我会在 8 分钟内完成。再次感谢!

标签: php object pass-by-reference


【解决方案1】:

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++ 代码中,没有通过引用传递。 (只有当一个参数有&amp; 时,它才在C++ 中通过引用传递,就像在PHP 中一样。)你能明白为什么这个对象会改变吗?

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

【讨论】:

  • 感谢您的意见!我不完全理解分配参数是什么意思。对象构造器的参数?
  • @PiWo:参数是传递的参数进入的变量,例如$foo 在构造函数中。如果你分配给那个变量,即$foo = something,那么如果它是按值传递的(不是&amp;),它对调用者没有影响;但如果它是通过引用传递的(使用&amp;),那么它的作用与您在调用范围内分配给传递的变量相同。当然,按引用传递假定您传递的是真实变量,而不是 $this
  • 我现在明白了。谢谢!
【解决方案2】:

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

【讨论】:

  • 如果有&amp;,则只有“通过引用传递”,否则按值传递。时期。 “对象”在 PHP5 中不是值,不能“通过”;相反,您拥有的是指向对象的指针。如果参数没有&amp;,则按值传递。
【解决方案3】:

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

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.

【讨论】:

  • 错了。如果参数没有&amp;,则始终按值传递某些东西,无论类型如何;如果有&amp;,则始终按值传递。 “对象”不是值,不能“通过”。通过引用传递对象指针(或任何其他类型)允许您分配给参数,就像您在传递的变量中分配一样,如果按值传递,则无法做到这一点。
  • 不正确,实际上,对象总是通过引用传递。大多数开发人员并不关心如何在低级别进行处理。否决票是不必要的。
  • 确实如此。当没有&amp; 时,传递和分配在 PHP 中的工作方式与在 Java 中完全相同。根据您的逻辑,Java 中的“对象总是通过引用传递”。但是环顾四周,你会发现 Java 只是传值。
猜你喜欢
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
相关资源
最近更新 更多