2012-06-14 59 views
0

我一直想知道如何以乾淨和簡潔的方式高效地檢查我的所有參數。 我想出了:檢查所有函數參數

function fooBar($myArg, $mySecondArg, $myOptionnalArg = "defaultValue"){ 
    if(!isset($myArg, $mySecondArg, $myOptionnalArg){ 
     die(__FUNCTION__ . ":missing parameter"); 
    } 

    if(empty($myArg, $mySecondArg, $myOptionnalArg){ 
     die(__FUNCTION__ . ":empty parameter"); 
    } 
    //Do stuff 
} 

我在尋找什麼是更喜歡:

function fooBar($myArg, $mySecondArg, $myOptionnalArg = "defaultValue"){ 
    $argArray = func_get_args(); 
    foreach($argArray as $a){ 
     if(empty($a)){ 
      die(__FUNCTION__.":".get_arg_name($a)."is empty"); 
     }   
     if(!isset($a)){ 
      die(__FUNCTION__.":".get_arg_name($a)."is unset"); 
     }  
    } 
    //Do stuff 
} 

至極不起作用,因爲get_arg_name();是純粹的小說,並func_get_args();返回實際參數,而不是原型中定義的那些。

有人能給我一個提示嗎?任何其他良好/乾淨的方式來實現這一點也是受歡迎的。 感謝

+0

難道你不覺得你應該確保參數是有效的* *之前調用與所提到的參數的函數?函數應該儘可能少地做些工作,儘可能保持代碼的乾淨和解耦。只要你想檢查參數是否符合某些方案(不管它們是空的還是未設置等),就可以從函數內部找到某些東西。您可以鍵入提示參數以使您的函數更具類型感知能力,但在調用函數之前而不是之後檢查變量。 –

+0

@NB,驗證前提條件相當普遍,至少在「外殼功能」中是如此。 – goat

+0

如果我的習慣不好或者不好,請嘮叨。但是,如果他們沒有得到他們期望的參數,我習慣於發生崩潰。寫'sum(「字符串」,「anothertring」);'不應該在我看來是可能的。我正在尋找一種方法來避免這種情況。 –

回答

3

僅限於reflection。一些示例:

function test($a, $b, $c) { 
    $function = new ReflectionFunction(__FUNCTION__); 
    $parameters = $function->getParameters(); 

    print_r($parameters); 
} 

test(0, 1, 2); 

你會看到這樣的事情:

Array 
(
    [0] => ReflectionParameter Object 
     (
      [name] => a 
     ) 

    [1] => ReflectionParameter Object 
     (
      [name] => b 
     ) 

    [2] => ReflectionParameter Object 
     (
      [name] => c 
     ) 

) 
+0

這正是我所期待的。但據我所知,性能值得一提。 –

1

它可能得到你需要使用PHP反思什麼:

http://php.net/manual/en/book.reflection.php

請閱讀更多關於如何使用它。

+0

這是正確的,但我會補充說,反射是有點慢。我覺得性能值得一提,因爲有人可能會在他們的許多php函數中使用這樣的代碼。 – goat

+0

只有在出現任何錯誤時纔可以進行反射,但不是所有時間!因此,不會有性能問題。只要做得好。 – Anton

+0

不正確。錯誤並不總是由無效參數導致的。 – goat