我最近一直在处理旧项目并稍微升级它们。我构造了类似下面的代码:
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;
}
我的逻辑确实失败了,但如果有人告诉我在哪里以及为什么,我会很感激。)
答案 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)
答案 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.