我正在通過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變量功能,使功能通過外部接口,並從代碼透明地調用這兩個參數更好的辦法?如果是的話,你會如何實現它?
好極了!反射對於這項任務是完美的。我已經提交了一個編輯到您的答案,以顯示我的問題的範例。布拉沃先生! – Stecman