2015-12-24 63 views
3

我寫了一個函數,該函數應該接受一些變量,然後更改這些變量的值。但是,運行該函數後,變量保持不變。然後我做了一些Google搜索,發現你需要在變量名前加上&。代碼然後做了我想要的事情。但是,我不明白你爲什麼需要把&。有沒有其他方法可以完成我需要做的事情?基本上我對通過引用的概念感到困惑。這是我的困境開始的地方,LOL:爲什麼在PHP中通過引用傳遞?

在迄今爲止我學到的所有語言(python,java,ruby)中,函數會採用的參數會根據算法中的指示更改變量的值沒有任何passing by reference,這是我剛剛在PHP中發現的一個概念。爲什麼PHP選擇這樣做?您能否解釋參考背後的邏輯?最後,網絡上有人在說:不要使用引用?如果不是的話,我還能如何解決我的問題。然後還有在PHP中的參考文獻中的貶低...對不起,這是一個混亂。

我通過PHP手冊進行了參考,但我發現它很難消化。

下面是一些代碼,我添加了&標誌:

<?php 

$comments = ""; 
$airline_name = "United"; 
$flight_number = "262"; 
$departure_airport = ""; 

function airport(&$one, &$two, &$three, &$four) { 
    if (!empty($one) || !empty($two) || !empty($three)) { 
     $one = !empty($one) ? "Airline Name: $one<br>" :"Airline Name: PLEASE PROVIDE AIRLINE NAME<br>"; 
     $two = !empty($two) ? "Flight Number: $two<br>" : "Flight Number: PLEASE PROVIDE FLIGHT NUMBER<br>"; 
     $three = !empty($three) ? "Departure Airport: $three<br>" : "Departure Airport: PLEASE PROVIDE DEPARTURE AIRPORT<br>"; 
     $four = !empty($four) ? "Comments: $four<br>" : ""; 
    } 

} 

airport($airline_name,$flight_number,$departure_airport,$comments); 

echo $airline_name,$flight_number,$departure_airport,$comments; 

?> 
+3

這是一個糟糕的編程習慣。傳遞值,獲得新值。這更可維護,更安全。 –

+2

http://stackoverflow.com/questions/2157799/when-to-pass-by-reference-in-php --- http://stackoverflow.com/questions/11360810/php-pass-by-reference- confusion問題是,*爲什麼?* –

+0

如果函數以數組形式返回新值,您可以執行'list($ var1,$ var2)= myFunc()' – SmokeyPHP

回答

4

一些其他語言並不需要這樣做的原因,是因爲他們使用對象:改變一個對象的狀態反映在指向該對象的所有參考文獻中。但是,如果您在Java中傳遞基本類型(如int)並且更改了該參數,則該值不會被更改。同樣的故事也適用於String,因爲您無法修改它們的狀態,所以只能修改作爲參數傳遞的引用。請注意,它仍然是按值傳遞的,因爲您複製的引用基本上是您的方法對於對象所持有的。

PHP按值傳遞一個字符串,這意味着 - 至少在概念上 - 在調用它之前創建一個字符串的副本。

儘管如此通過引用有時被認爲是危險的。這是一個在C和C++(甚至在C#中)中使用的概念,但像Java這樣的編程語言不允許這樣做。你最好使用輸出使能的變量的修改,因爲它使語法明確:

function airport($one,$two,$three,$four) { 
    if (!empty($one) || !empty($two) || !empty($three)) { 
     $one = !empty($one) ? "Airline Name: $one<br>" :"Airline Name: PLEASE PROVIDE AIRLINE NAME<br>"; 
     $two = !empty($two) ? "Flight Number: $two<br>" : "Flight Number: PLEASE PROVIDE FLIGHT NUMBER<br>"; 
     $three = !empty($three) ? "Departure Airport: $three<br>" : "Departure Airport: PLEASE PROVIDE DEPARTURE AIRPORT<br>"; 
     $four = !empty($four) ? "Comments: $four<br>" : ""; 
    } 
    return array($one,$two,$three,$four); 
} 

,並稱之爲:

list($airline_name,$flight_number,$departure_airport,$comments) = airport($airline_name,$flight_number,$departure_airport,$comments); 

list是你引用調用變量特殊功能(是的,你這樣做,它實際上是一個語言結構如手冊中所述)。要點是當您將一個數組分配給list結構時,array中的元素將按照元素方式分配給列表中指定的變量。例如(來自here截取):

list($drink, $color, $power) = array('coffee', 'brown', 'caffeine'); 

相當於:

$drink = 'coffee'; 
$color = 'brown'; 
$power = 'caffeine'; 

因此有更多或更少的array相反:你陣列分割成元件,並執行逐元素分配。


使用list,大家很清楚這些變量會改變。此外,您不必查看函數簽名來知道變量是否會改變:它不會。如果您改變主意並想設置其他變量,那也很容易。

+0

謝謝!你可以在答案中進一步解釋代碼嗎?所以你最終返回一個數組,然後當你設置列表時你到底在做什麼?我以前從來沒有見過。 –

+0

@GovindRai:查看更新的答案。 –

+1

「一些其他語言不需要這樣做的原因是因爲它們使用對象:改變對象的狀態反映到指向該對象的所有引用。」 PHP 5+中的對象完全一樣。 – newacct