使用 PHP 将 byref var 分配给另一个 var 是分配引用还是复制值?
With PHP does assigning a byref var to another var assign the reference or copy the value?
以我正在从事的项目中的摘要 class 为例。 (减去所有真正有趣的部分)。
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 将其分配给受保护的变量,我是否需要再次通过参考分配?
像这样:
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 reference";这意味着如果函数中的值发生变化,它也会在调用脚本中发生变化。
但是 - 因为它提供了更好的性能 - 如果你传递 "by value",PHP 仍然传递对函数的引用,但如果你更改函数。
请注意,对象总是有效的"pass by reference",因为您的对象变量实际上是指向对象的指针,因此函数内部对对象的任何更改也会反映在函数外部。
除非您明确希望在函数内部更改的变量在函数外部也被更改,否则不要通过引用传递。
如果您想要 "copy" 内部对象的 class,而不是引用;然后使用 clone
创建一个副本。
以我正在从事的项目中的摘要 class 为例。 (减去所有真正有趣的部分)。
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 将其分配给受保护的变量,我是否需要再次通过参考分配?
像这样:
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 reference";这意味着如果函数中的值发生变化,它也会在调用脚本中发生变化。
但是 - 因为它提供了更好的性能 - 如果你传递 "by value",PHP 仍然传递对函数的引用,但如果你更改函数。
请注意,对象总是有效的"pass by reference",因为您的对象变量实际上是指向对象的指针,因此函数内部对对象的任何更改也会反映在函数外部。
除非您明确希望在函数内部更改的变量在函数外部也被更改,否则不要通过引用传递。
如果您想要 "copy" 内部对象的 class,而不是引用;然后使用 clone
创建一个副本。