-
首先需要說明的是,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);