從CodeIgniter的show_error
功能看看下面的代碼:傳遞參考 - 它是如何工作的,它爲什麼被使用?
$_error =& load_class('Exceptions', 'core');
爲load_class
函數的文檔說,它作爲一個單身。該函數基本上採用給定的參數並在適當的路徑中搜索類。然後它包含文件,如果它存在。該函數聲明爲:
function &load_class(...)
爲什麼它有&,什麼是它的目的是什麼? $_error
是這樣定義函數的結果嗎?
從CodeIgniter的show_error
功能看看下面的代碼:傳遞參考 - 它是如何工作的,它爲什麼被使用?
$_error =& load_class('Exceptions', 'core');
爲load_class
函數的文檔說,它作爲一個單身。該函數基本上採用給定的參數並在適當的路徑中搜索類。然後它包含文件,如果它存在。該函數聲明爲:
function &load_class(...)
爲什麼它有&,什麼是它的目的是什麼? $_error
是這樣定義函數的結果嗎?
的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解釋。
但這對於問題中的功能沒有意義。 'load_class'函數檢查字典中是否存在某個鍵的值,如果是,則返回它,如果不創建適當的值,則將其放入字典並返回。一旦將密鑰的值放入該字典中,它就不會爲該密鑰設置另一個值。所以它不像你這裏的例子。 – newacct
我沒有看到任何聲明和使用load_class
這樣的觀點。從load_class()
的源代碼中,我們可以看到它將加載的對象緩存在類名爲數組的數組中。如果它不在緩存中,它會加載一個給定名稱的對象,然後將該對象引用存儲到數組中。在這兩種情況下,它都會返回數組的元素(通過引用)。
通過引用返回允許調用者引用數組的元素。這允許我們做的唯一事情是:
load_class
函數在設置它之後從不會更改與某個鍵相關聯的值。所以沒有合理的理由通過引用返回。我的猜測是,它是PHP 4中的一個剩餘部分,當對象是值時,分配或返回「對象值」會複製它。在PHP 5中,對象不是值;您只能通過對象引用來操作它們,並且按值分配或返回對象引用不會複製它指向的對象。
這樣您就可以獲得一致的CI對象。修改屬性,添加覆蓋等等的東西都是通過引用完成的,所以你沒有可能無法繼承到另一個對象的獨立CI對象。 – Brendan
@Brendan:這沒有道理。由'load_class()'返回的值的類型是對象引用(當你在PHP 5中執行'New Something'時,它會計算一個對象引用)。按值複製或分配對象引用不會創建新對象;他們創建更多的指向該對象的對象引用。 – newacct