2012-12-05 74 views
1

從CodeIgniter的show_error功能看看下面的代碼:傳遞參考 - 它是如何工作的,它爲什麼被使用?

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

load_class函數的文檔說,它作爲一個單身。該函數基本上採用給定的參數並在適當的路徑中搜索類。然後它包含文件,如果它存在。該函數聲明爲:

function &load_class(...)

爲什麼它有&,什麼是它的目的是什麼? $_error是這樣定義函數的結果嗎?

+1

這樣您就可以獲得一致的CI對象。修改屬性,添加覆蓋等等的東西都是通過引用完成的,所以你沒有可能無法繼承到另一個對象的獨立CI對象。 – Brendan

+0

@Brendan:這沒有道理。由'load_class()'返回的值的類型是對象引用(當你在PHP 5中執行'New Something'時,它會計算一個對象引用)。按值複製或分配對象引用不會創建新對象;他們創建更多的指向該對象的對象引用。 – newacct

回答

0

的PHP documentation似乎可以解釋爲什麼要使用,即使=&功能被標記爲返回refrence 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。

如果你問一般什麼引用的documentation解釋。

+1

但這對於問題中的功能沒有意義。 'load_class'函數檢查字典中是否存在某個鍵的值,如果是,則返回它,如果不創建適當的值,則將其放入字典並返回。一旦將密鑰的值放入該字典中,它就不會爲該密鑰設置另一個值。所以它不像你這裏的例子。 – newacct

1

我沒有看到任何聲明和使用load_class這樣的觀點。從load_class()的源代碼中,我們可以看到它將加載的對象緩存在類名爲數組的數組中。如果它不在緩存中,它會加載一個給定名稱的對象,然後將該對象引用存儲到數組中。在這兩種情況下,它都會返回數組的元素(通過引用)。

通過引用返回允許調用者引用數組的元素。這允許我們做的唯一事情是:

  1. 請參閱我們擁有的外部參考後面對該數組元素(即與該關鍵字相關的值)的更改。但是這不適用,因爲load_class函數在設置它之後從不會更改與某個鍵相關聯的值。
  2. 有外部代碼能夠更改陣列中的元素,而功能不知道它。但是,這將是一個非常可疑的做法,從外部混淆緩存,我非常懷疑這是作者想要的東西。

所以沒有合理的理由通過引用返回。我的猜測是,它是PHP 4中的一個剩餘部分,當對象是值時,分配或返回「對象值」會複製它。在PHP 5中,對象不是值;您只能通過對象引用來操作它們,並且按值分配或返回對象引用不會複製它指向的對象。

相關問題