通过引用传递 - 它是如何工作的以及为什么使用它?

时间:2012-12-05 16:25:50

标签: php codeigniter pass-by-reference

从CodeIgniter的show_error函数中获取以下代码:

$_error =& load_class('Exceptions', 'core');

load_class函数的文档说它充当单例。该函数基本上采用给定的参数并在适当的路径中搜索类。然后它包含文件(如果存在)。该函数声明为:

function &load_class(...)

为什么它有&它的目的是什么? $_error是否被声明为定义函数的结果?

2 个答案:

答案 0 :(得分:1)

我没有看到任何声明和使用load_class的意思。从load_class()的源代码中,我们可以看到它将加载的对象缓存在一个以类名作为键的数组中。如果它不在缓存中,则会加载给定名称的对象,然后将该对象引用存储到数组中。在这两种情况下,它都返回数组的元素(通过引用)。

通过引用返回允许调用者具有对数组元素的引用。这使我们能做的唯一事情是:

  1. 从我们的外部引用中查看对该数组元素的后续更改(即与该键关联的值)。但这不适用,因为load_class函数在设置后不会更改与键关联的值。
  2. 让外部代码能够更改数组中的元素,而不知道load_class函数。但这是一个非常可疑的做法,从外面搞乱缓存,我非常怀疑这是作者想要的。
  3. 因此没有合理的理由通过引用返回。我的猜测是它是PHP 4的剩余部分,当对象是值时,因此分配或返回“对象值”会复制它。在PHP 5中,对象不是值;您只能通过对象引用来操作它们,并且按值分配或返回对象引用永远不会复制它指向的对象。

答案 1 :(得分:0)

php documentation似乎解释了为什么你必须使用=&,即使该函数被标记为返回参考function &load_class

  

返回参考文献

     

当您想要使用函数时,通过引用返回很有用   找到应该绑定引用的变量。不使用   按引用返回以提高性能。引擎会   自动优化它。仅在返回时引用   你有充分的技术理由这样做。要返回引用,请使用   这句语法:

 <?php class foo {
     public $value = 42;

     public function &getValue() {
         return $this->value;
     } 
  }



$obj = new foo; 
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2; 
echo $myValue;
// prints the new value of $obj->value, i.e. 2. ?> 

在此示例中,

  

getValue函数返回的对象的属性是   设置,而不是副本,因为没有使用引用语法。    注意:与参数传递不同,这里你必须使用&amp;在这两个地方    - 表示您希望通过引用而不是副本返回,并指示引用绑定而不是通常的赋值应该   $ myValue。

如果您在询问documentation解释的一般参考文献。