2012-05-30 53 views
1

我尋找一個PHP函數簽名的確切類型Required ParameterPHP函數所需的參數混亂

初始化是否只與NULL使它成爲一個可選的參數?即

function foo($optional=NULL, $OptionalOrRequired="Optional Or Required", $required){} 

我對第二個參數感到困惑,它是否在Required或Optional參數中?

UPDATE

我使用reflection讓所有和所需的功能參數

public function getPlayer($params=3, $c){} 
// results 
$reflection->getNumberOfParameters()   -> 2 
$reflection->getNumberOfRequiredParameters() -> 2 // it should be one 

public function getPlayer($params=3, $c, $x=NULL) 
// results 
$reflection->getNumberOfParameters()   -> 3 
$reflection->getNumberOfRequiredParameters() -> 2 

正如我在一個答案,默認自帶之前需要得到的,這是什麼原因的反射功能返回所需參數的錯誤數量?

感謝

+0

基本上,你從函數聲明中省略了參數的右邊,即'= null',那麼它是必需的,否則如果沒有提供,參數就會假設你在參數聲明右邊指定的默認值。 – Gavin

+0

感謝您的快速回復加文,我真的很困惑這個NULL與我在第二個參數中使用的實際值。在給定的方法簽名是第二個參數可選或需要? – Junaid

+0

可選的,因爲你已經提供了它的默認值,如果用戶在調用它時不提供一個值。 – Gavin

回答

2

'可選的論點只是一個默認值參數,該值是nullfalse,一個字符串(等)並不重要 - 如果一個函數的參數有默認值是可選的。

但是,將一個可選參數放在必需參數之前是沒有意義的,因爲您必須爲先前的參數提供一些值(即使它是null)才能「進入」所需的參數 - 所以在最後一個「必需」參數之前的所有參數都是有效的。

一些例子:

// Bad 
function bad($optional = 'literally anything', $required) {} 

bad('required arg');    // This breaks - 'missing argument 2' 
bad('something', 'required arg'); // This works - both parameters are needed 

// Good 
function($required, $optional = 'literally anything') {} 

good('required arg');    // This works just fine, last argument has a default 
good('required arg', 'something'); // Also works fine, overrides 'literally anything' 

更新RE:反射

如上所述,把一個「可選的」參數必需的參數有效地使所需「可選」參數之前,作爲值必須給予它以便永遠滿足方法簽名。例如,如果第一個參數有默認值,第二個參數不是(比如上面的bad函數),我們需要傳遞第二個參數,所以我們也需要傳遞第一個參數,所以兩者都是'需要'。如果有後續的參數與默認值,仍然只有前兩個參數是必需的。

+0

plz看到我的更新問題 – Junaid

+0

對我有意義知道,謝謝:) – Junaid

+0

希望它有幫助:) – connec

1

你不能有後PHP可選參數來必需的參數。可選參數始終必須遵循所需的參數(如果有的話)。任何提供了默認值的參數(例如$param = 'default')都是可選的,並且需要任何沒有默認值的參數。

-1

繼續我的評論。

function test($required, $optional = null) 
{ 

} 

test(); // throws an error stating $required is missing 
test('a'); // sets $required to 'a' and $optional is null 
test('a', 'b'); // sets $required to 'a' and $optional to 'b' 
+0

這不是OP正在談論的內容。他對可選參數首先出現的函數以及所需的參數感到困惑。例如:'功能測試($ optional = null,$ required)' – Kayla