PHP如何動態傳入參數


  • 首先需要說明的是,URL寫作/index.php/xx/b/c可以直接被index.php文件接受,而不用做任何額外的操作

  • 但是如果需要在URL中隱藏index.php的話,才需要偽靜態重寫規則,將^(.*)$重寫到/index.php/$1

  • 首先,需要從URI拆分鍵值對(此處省略)

  • 下面的思路是(依次):

    • 獲取到要調用函數的參數名

    • 按照參數名稱排序URI拆分出的鍵值對

    • 使用call_user_func_array()方法,動態調用函數

  • 由於鍵值對經過了按照參數名順序排序,所以新的URI鍵值對中,值的順序恰好是和需要調用函數的順序對應的,所以可以直接用call_user_func_array()調用

  • 下面,介紹一下其中需要用到的知識:

    • call_user_func_array

    • array_fill_keys

    • ReflectionFunction或者ReflectionMethod

    • 由於Reflection部分缺少官方文檔,貼出Overflow的回答作為示例:https://stackoverflow.com/que...

  • 下面上代碼:

function test(....) {
}

...

$funcRef = new ReflectionFunction('test');
# 或者$funcRef = new ReflectionMethod('class', 'test');

$paramNames = [];

foreach($funcRef->getParameters() as $param) {
    $paramNames[] = $param->name;
}

$params = array_fill_keys($paramNames, NULL);
# 使用NULL為默認值,$paramNames為鍵名,填充一個參數鍵值對
# 如果參數對應項不傳值,則那個值默認是NULL(暫不考慮有默認值的情況)

# 假設從URI獲取的鍵值對生成的數組為$URIParam
# 將$URIParam中的值填入上面生成的參數數組中
# 遍歷$params在$URIParam中找的原因是,如果遍歷$URIParam,對應的$params中的值都是NULL,無法通過值確定鍵名是否存在
# 而遍歷$params的話,鍵名一定是參數列表中的,只需要看在$URIParams中是否存在即可
foreach($params as $paramName => $param) {
    if(isset($URIParam[$paramName])) {
    # 使用isset是為了避免直接判斷而產生的等效假值問題
    # 如果用if($URIParam[$paramName])無法區分0和''這種等效於假值的值
        $params[$paramName] = $param;
        # 由於,$params中的值已經定義過了,所以此處賦值並不會影響其順序
    }
}

call_user_func('test', $params);
# 或者call_user_func_array([$class, 'method'], $params);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM