以我正在处理的一个项目中的这个抽象类为例。(减去所有真正有趣的部分)。
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;
}
}
我一直在打结,试图解决这个问题,因为它们看起来都是对的。
根据定义,by 引用是"通过引用";这意味着如果在函数中更改了值,则在调用脚本中也会更改该值。
但是 - 因为它提供了更好的性能 - 如果你传递"按值",PHP 仍然传递对函数的引用,但如果你更改函数中的值,则会创建一个副本(按值)。
请注意,对象始终有效地"通过引用传递",因为对象变量实际上是指向对象的指针,因此对函数内部对象的任何更改也将反映在函数外部。
不要通过引用传递,除非您明确希望函数内部更改的变量也在函数外部更改。
如果你想要类中对象的"副本",而不是引用;那么使用 clone
创建一个副本。