2010-10-13 116 views
2

可選參數我有一個功能,它有四個可選參數:問題與PHP

public function doSomething($x = null, $y = null, $a = null, $b = null) { } 

然而,當我嘗試調用該函數,例如僅指定$ Y:

$object->doSomething($y=3) 

它似乎忽略了我將$ y設置爲3,而將$ x設置爲3.是否有任何理由說明PHP可能會發生這種情況?我從來沒有使用過有這個問題之前......

感謝,

回答

6

您必須傳遞參數的順序,你在你的方法簽名聲明,無論他們是否可選。這意味着您必須在$y之前指定$x,無論如何。

如果您不需要傳遞$x的任何其他值,則必須傳遞null值。當然,您仍然可以跳過其餘的可選參數:

$object->doSomething(NULL, 3) 

此外,PHP不支持命名參數。因此,您不能在調用代碼中明確寫入$y,因爲在PHP中實際上在調用代碼的範圍內設置了$y,而不是在doSomething()的方法體的範圍內。

編輯:每DPK的建議,作爲替代路線可以改變的方法來接受的散列(關聯數組)代替,以及任選地覆蓋某些默認值和extract()入範圍的它的值:

public function doSomething(array $args = array()) { 
    $defaults = array('x' => NULL, 'y' => NULL, 'a' => NULL, 'b' => NULL); 
    extract(array_merge($defaults, $args)); 

    // Use $x et al as normal... 
} 

在您的調用代碼:

$object->doSomething(array('y' => 3)); 
+1

沒錯。按照OP的預期,這樣做的方式是傳遞一個散列作爲參數(array('y'=> 3))或一些類似的數據結構(object ..) – 2010-10-13 21:48:27

+0

感謝你 - 出於某種原因,我處於假設你可以做我正在做的事情。一定是另一種語言悄悄進入! – Dan 2010-10-13 21:58:47

1

即使$ x是可選的,位置也不是那麼$ Y需要在第二個參數。試試:

$object->doSomething(null,3);