我有两个类。我对第二个类如何编辑第一个类的属性而不被传递第一个类作为引用感到困惑。
first.php
namespace first;
class first {
public $prop = 'first value';
function __construct(){
$second = '\second\second';
require 'second.php';
call_user_func_array(array(new $second, 'method'), array($this));
}
}
$first = new first();
echo $first->prop;
second.php
namespace second;
class second {
function method($first){
$first->prop = 'second value';
}
}
我得到这样的输出:
second value
谁能解释一下第二个班是怎么做的?这似乎违背了我所学的一切。
在PHP默认情况下,对象是通过引用传递的。在你的例子中,你将类对象"first"传递给第二个类对象"second"。所以PHP为你做,你不需要指定通过引用传递它,例如(&$variable),因为$this是一个对象而不是一个变量。如果你要传递一个$变量那么你必须指定你是否想通过引用传递它($second->method(&$variable))
call_user_func_array(array(new $second, 'method'), array($this));
在该调用中,您传递($this)作为类中方法"method"的参数,并修改属性"prop"。
这个函数起作用了。
call_user_func_array()
—call_user_func_array—使用参数数组调用回调函数
function __construct(){
$second = '\second\second';
require 'second.php';
//This is the call back function which
call_user_func_array(array(new $second, 'method'), array($this));
}
call_user_func_array(array(new $second, 'method'), array($this));
这个函数有两个参数,array(new $second, 'method'), array($this)
在第一个参数中,你有一个包含两个元素的数组,即new $second,和'method',它实例化了类new second和函数method。第二个参数是
array($this) which says this class, meaning or referring to `class first {}`
简而言之,第一个类之所以可以修改,是因为它有一个带有第二个类参数的回调函数。
你可以看看这个函数是如何工作的http://www.php.net/manual/en/function.call-user-func-array.php
按照Elin的建议,请阅读http://www.php.net/manual/en/language.oop5.references.php。它回答了所有问题。
从PHP 5开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问器找到实际的对象。当一个对象通过参数发送、返回或赋值给另一个变量时,不同的变量不是别名:它们持有指向同一对象的标识符的副本。