1

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

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

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

function &load_class(...)

为什么它有&,它的目的是什么?$_error像这样定义函数的结果是这样声明的吗?

4

2 回答 2

1

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

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

  1. 稍后从我们拥有的外部引用中查看对该数组元素(即与该键关联的值)的更改。但这不适用,因为该load_class函数在设置键后永远不会更改与键关联的值。
  2. 让外部代码能够在load_class函数不知道的情况下更改数组中的元素。但这将是一个非常可疑的做法,从外部弄乱缓存,我非常怀疑这是作者想要的。

因此,没有正当理由通过引用返回。我的猜测是它是 PHP 4 的遗留物,当时对象是值,因此分配或返回“对象值”会复制它。在 PHP 5 中,对象不是值;您只能通过对象引用来操作它们,并且通过值分配或返回对象引用永远不会复制它指向的对象。

于 2012-12-06T05:22:45.630 回答
0

php文档似乎解释了为什么你必须使用=&即使该函数被标记为返回一个参考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 函数返回的对象的属性将被设置,而不是副本,因为它不会使用引用语法。 注意:与参数传递不同,这里你必须在两个地方都使用 & - 表示你想通过引用而不是副本返回,并表示应该为 $myValue 进行引用绑定,而不是通常的赋值。

如果您询问文档解释的一般参考资料。

于 2012-12-05T16:31:34.980 回答