2013-10-01 62 views
5

php是否可能在python中命名函數參數?一個例子的使用情況是:在PHP中命名的函數參數

function foo($username = "", $password = "", $timeout = 10) { 

} 

我要重寫$timeout

foo("", "", 3); 

難看。我寧願做:

foo(timeout=3); 
+0

答案是否定的,但我相信目前正在討論關於該主題的[RFC](https://wiki.php.net/rfc/named_pa​​rams),但它不太可能超出討論階段...... 。我相信Facebook的[hh](https://t.co/I0RUiMMEsb)實現它,雖然我做了 –

+0

,不起作用。 – Justin

+0

對不起,我誤解你在問什麼。 –

回答

4

號,命名參數在PHP中是不可能的。從技術角度而言,當您致電foo($timeout=3)時,它首先評估$timeout=3,結果爲3並將其作爲第一個參數傳遞給foo()。 PHP強制執行參數順序,因此可比較的調用將需要爲foo("", "", $timeout=3)。您有兩個其他選項:

  • 讓您的函數將數組作爲參數並檢查數組鍵。我個人發現這個醜陋的,但它的工作原理和可讀性。上行是簡單的,並且以後可以很容易地添加新的參數。缺點是你的功能較少自我記錄,你不會從IDE獲得很多幫助(自動完成,快速功能參數查找等)。
  • 設置沒有參數的函數並向PHP請求使用func_get_args()的參數或在PHP 5.6+中使用...variable length arguments feature。根據參數的數量,您可以決定如何處理每個參數。很多JQuery函數都是這樣做的。這很容易,但對於那些調用你的函數的人來說可能會造成混淆,因爲它也不是自我記錄。而你的論點仍然沒有命名。

請注意an RFC for named parameters仍在「正在討論中」。

+0

華麗從美學pov的分配技術。只有一個缺點,它看起來很像命名參數(ahem,這是沒有的?)。但是,這可能給人的印象是訂單無關緊要,事實上它的確如此。我想這部分不是那麼自我記錄。所以要糾正你的答案,你只能這樣做:'foo('','',$ timeout = 3);' – nus

+0

ps:還有其他一些小缺點:性能(很少會成爲問題),並可能覆蓋現有的變量。所有優勢超過'foo('','',3/* timeout * /);'是有問題的。 – nus

0

你應該使用其他參數訂購

foo($timeout=3,$username='',$password='') 

或考慮使用

func_get_args

+0

我認爲這是他詢問的一個普遍問題,而不是在這個特定情況下。 – Fluffeh

+0

超時雖然不屬於第一,但是很奇怪的行爲,標準是用戶名,密碼。 – Justin

+0

所以如果你想要你原來的順序 - 比你不得不使用func_get_args - 數它們,然後將它們設置爲你需要的變量,在其他情況下 - PHP如何知道你正在傳遞的超時 - isn'用戶名? – Axel

0

老問題,但這裏有一些更多的信息。

正如其他答案中所述,PHP不直接支持命名參數。 VBA是另一種具有奢華的語言。

在PHP中,你可以使用一個相當合理的替代品。 PHP的數組處理是特別好,你可以使用一個關聯數組傳遞的參數數組,如下所示:

function foo($parms=array()) { 
    $username = parms['username']?:'…'; 
    $password = parms['password']?:'…'; 
    $timeout = parms['timeout']?:'…'; 
} 

foo(array('timeout'=>10)); 

注意使用?:運營商的,允許一個簡單的默認如果輸入數組元素沒有按」不存在。

不是光滑的,但命名參數還有另一個重要的作用:它們允許您使用大量的選項,而沒有過長的有序參數列表。

寫入功能的另一種方法是使用`提取功能:

function foo($parms=array()) { 
    $username = '…'; 
    $password = '…'; 
    $timeout = '…'; 
    extract($parms,EXTR_IF_EXISTS); 
} 

這裏extract函數將值到變量,但前提是他們已經被定義。這可以防止導入你不知道的變量。