2012-06-27 62 views
0

我正在通過Web訪問的API,並一直試圖弄清楚作爲函數的參數分配$ _ POST/$ _GET變量的最整潔,最有效的方式分配$ _ POST變量作爲參數的默認值。我知道變量不能用作參數默認值,所以目標是DRY(不要重複自己);使應用程序和外部接口都可以使用API​​函數。解決方法,用於在功能

背景:

1)目前,API函數與公共靜態方法分爲類。當遠程請求時,被(安全地)確定的請求的類和方法,並且如果類+方法的組合是有效的,它使用call_user_func("$class::$method")調用。

2)的是最終調用class::method()代碼是有意喑 - 它不知道或關心的功能需要的參數。由於不能使用缺少參數調用函數,因此API中的所有函數都必須沒有參數,或者沒有缺省參數沒有參數。我想在這裏做最乾淨的東西是有與null默認定義所需的參數,讓函數處理的$分配_POST變量內部:

public static function complete($id = null, $offset = 0, $limit = 50){ ... } 

3)內部,API方法返回常規PHP變量,那麼外部接口用json_encode()對此值進行編碼。

我有什麼,現在的工作:

我想在第一,需要每個函數10個或更多額外的行數的怪物,但我已經縮短到一個可重複使用的功能。我看了一下extract(),但它不是精確的或者我的目的很安全。

function assign($postIndex, &$target, $require = true){ 
    // Any code assigned parameter overrides remote values 
    if($target != null && $require == true) 
     return; 

    // Force parameter requirement if specified 
    if($require && !isset($_POST[$postIndex])) 
     throw new MissingParameterException(); 

    // Assign to referenced variable if it's set 
    if(isset($_POST[$postIndex])) 
     $target = $_POST[$postIndex]; 
} 

使用,如:

public static function delete($id = null){ 
    assign('id', $id); 

    ... 

} 

請注意,我知道潛在的注入漏洞的;所有的API函數都會清除它們的參數,而不管其來源。我也知道,其他人使用這種方法可能會假設參數是安全的編寫函數的API,但是因爲assign()必須顯式調用,我覺得這有點無效(更何況,如果該函數更名assign_raw_post_var_to_param()) - 它本質上是爲明確寫爲$name = $_POST['name'];

的問題...

是否有分配_POST $/$ _ GET變量功能,使功能通過外部接口,並從代碼透明地調用這兩個參數更好的辦法?如果是的話,你會如何實現它?

回答

1

我認爲你需要call_user_func_array。使用它你可以指定一個參數數組,所以你可以保持簡單的方法簽名。

如果您不知道參數的順序並需要計算出運行時間,則可以使用reflections


編輯由OP:

反射是一個極好的解決方案。例如:

class TestClass { 
    public static function some_method($name, $email, $bannana){ 

    } 
} 

$reflection = new ReflectionMethod('TestClass', 'some_method'); 
$params = $reflection->getParameters(); 

$params現在看起來是這樣的:

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

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

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

) 
+0

好極了!反射對於這項任務是完美的。我已經提交了一個編輯到您的答案,以顯示我的問題的範例。布拉沃先生! – Stecman