2013-07-30 42 views
0

工作如果我試試這個代碼:PHP返回參照不正常功能工作,但與OOP

<?php 

class ref 
{ 

    public $reff = "original "; 

    public function &get_reff() 
    { 
     return $this->reff; 
    } 

    public function get_reff2() 
    { 
     return $this->reff; 
    } 
} 

$thereffc = new ref; 

$aa =& $thereffc->get_reff(); 

echo $aa; 

$aa = " the changed value "; 
echo $thereffc->get_reff(); // says "the changed value " 
echo $thereffc->reff; // same thing 
?> 

然後通過參考書返回和對象屬性$reff的值被改變的變量$aa引用它也會改變。

但是,當我嘗試使用不在類內的普通函數時,它不起作用!

我試過這段代碼:

<?php 

function &foo() 
{ 
    $param = " the first <br>"; 
    return $param; 
} 

$a = & foo(); 

$a = " the second <br>"; 

echo foo(); // just says "the first" !!! 

它看起來像功能foo()不會承認它返回由參考,並固執地返回想要的東西!

是否僅在OOP環境中通過引用工作返回?

+3

我真正感興趣的,爲什麼你想那個呢?什麼曾經迫使你做這樣的事情? –

+0

madara我讀了關於通過引用返回和通過我閱讀wordpress中使用的函數的方式,所以我想知道什麼編碼器希望通過在他的功能的名稱之前添加一個&! – hanachi

+0

在返回一些大的情況下(不只是一個字符串,而是說一個巨大的結果集)如果通過引用返回,你通過它的地址返回,而不是複製整個結果到一個新的變量。它並不像你所假設的那樣將函數範圍內的變量保留下來。 – Doon

回答

3

這是因爲當函數調用完成時,函數的範圍崩潰,並且未設置變量的本地函數引用。任何對函數的後續調用都會創建一個新的$ param變量。

即使在函數中不是這樣的情況下,您將在每次調用該函數時將該變量重新分配給the first <br>

如果您想要證明參考工作返回工作使用static關鍵字來爲函數變量提供持久狀態。

見這個例子

function &test(){ 
    static $param = "Hello\n"; 
    return $param; 
} 


$a = &test(); 
echo $a; 
$a = "Goodbye\n"; 

echo test(); 

Echo的

Hello 
Goodbye 
+0

arigato madara;是的,我知道這一點!那麼通過參考返回是一個神話? – hanachi

+0

號。這不是一個神話,你已經證明了它在的情況下,這將是明智的行爲,即具有持久狀態的對象。 – Orangepill

+0

我已經證明,它是一個類中的OOP的現實,但不是正常的PHP代碼! – hanachi

0

是否通過參考工作僅在OOP情況下返回?

如果這是一個函數或類方法,returning by reference始終有效。

你提出的問題表明你可能還沒有完全理解PHP中的引用是什麼,正如我們都知道的那樣 - 可能會發生。我建議你閱讀PHP手冊中的整個主題,以及不同作者的至少兩個來源。這是一個複雜的話題。

在你的例子中,小心你在這裏返回的引用btw。您將$param設置爲該值 - 總是 - 當您調用該函數時,該函數將返回對該新設置變量的引用。

所以這更是變量範圍的問題,你在這裏問:

+0

謝謝你的建議,但我會貪心!你能糾正我的功能,以便通過參考工作返回?我是在php 4簡單的函數telking只是不要使用函數內部的靜態變量,而不是已經引用的參數!我會很感謝! – hanachi

+0

你的例子中沒有什麼可以工作的。正如所寫,以這種方式編寫函數更多的是你誤解了什麼變量作用域。只有使用引用返回也不會引入量化轉換,這會使變量作用域過時。因爲它本質上不清楚你想要做什麼,所以沒有代碼可以提供。也沒有什麼可以解決的。你應該更加貪婪,並且比尋找代碼更需要你自己的理解。例如,一個簡單的解決方法是通過引用刪除返回。然後再想想你的設計。 – hakre