當我開啟 'URL_PARAMS_BIND_TYPE'=>1, //傳參模式,允許順序傳參,也就是URL不寫變數名稱
訪問
http://localhost/yb1/Home/Get...
怎麼啥也沒?
請問在thinkPHP 裡怎麼給 $_GET[""] 賦值?
<code> public function test($id ,$name ) { echo $_GET["id"] . "-" . $_GET["name"]; } </code>
當我開啟 'URL_PARAMS_BIND_TYPE'=>1, //傳參模式,允許順序傳參,也就是URL不寫變數名稱
訪問
http://localhost/yb1/Home/Get...
怎麼啥也沒?
請問在thinkPHP 裡怎麼給 $_GET[""] 賦值?
<code> public function test($id ,$name ) { echo $_GET["id"] . "-" . $_GET["name"]; } </code>
這時候就需要上程式碼來解釋這些神奇的問題啦.
向下看(來自ThinkPHPLibraryThinkDispatcher.class.php
211行):
<code> $depr = C('URL_PATHINFO_DEPR'); $paths = explode($depr,trim($_SERVER['PATH_INFO'],$depr)); if(!defined('BIND_CONTROLLER')) {// 获取控制器 if(C('CONTROLLER_LEVEL')>1){// 控制器层次 $_GET[$varController] = implode('/',array_slice($paths,0,C('CONTROLLER_LEVEL'))); $paths = array_slice($paths, C('CONTROLLER_LEVEL')); }else{ $_GET[$varController] = array_shift($paths); } } // 获取操作 if(!defined('BIND_ACTION')){ $_GET[$varAction] = array_shift($paths); } // 解析剩余的URL参数 $var = array(); if(C('URL_PARAMS_BIND') && 1 == C('URL_PARAMS_BIND_TYPE')){ // URL参数按顺序绑定变量 $var = $paths; }else{ preg_replace_callback('/(\w+)\/([^\/]+)/', function($match) use(&$var){$var[$match[1]]=strip_tags($match[2]);}, implode('/',$paths)); } $_GET = array_merge($var,$_GET); }</code>
程式碼中首先會把url中的路徑資訊切割,也就是Getpost/test/2/xxx
這一部分,而其中在前面的獲取控制器階段,會把Getpost/test
進行移除,最後到了URL參數綁定的過程中,就會直接將paths
資料賦值給var
,然後在於$_GET
數組進行合併,所以,在$_GET數組中是只存在值,而不存在樓主要的鍵的,因為TP並不知道你要綁定的是哪個鍵.
關於如何綁定,那就繼續看程式碼:
向下看(來自ThinkPHPLibraryThinkApp.class.php
136行):
<code> switch($_SERVER['REQUEST_METHOD']) { case 'POST': $vars = array_merge($_GET,$_POST); break; case 'PUT': parse_str(file_get_contents('php://input'), $vars); break; default: $vars = $_GET; } $params = $method->getParameters(); $paramsBindType = C('URL_PARAMS_BIND_TYPE'); foreach ($params as $param){ $name = $param->getName(); if( 1 == $paramsBindType && !empty($vars) ){ $args[] = array_shift($vars); }elseif( 0 == $paramsBindType && isset($vars[$name])){ $args[] = $vars[$name]; }elseif($param->isDefaultValueAvailable()){ $args[] = $param->getDefaultValue(); }else{ E(L('_PARAM_ERROR_').':'.$name); } } // 开启绑定参数过滤机制 if(C('URL_PARAMS_SAFE')){ $filters = C('URL_PARAMS_FILTER')?:C('DEFAULT_FILTER'); if($filters) { $filters = explode(',',$filters); foreach($filters as $filter){ $args = array_map_recursive($filter,$args); // 参数过滤 } } } array_walk_recursive($args,'think_filter'); $method->invokeArgs($module,$args);</code>
以上就是綁定參數的程式碼,其中當URL_PARAMS_BIND_TYPE
為true時,他就會將路徑參數依次彈出給函數的參數,然後在利用invokeArgs進行賦值.
直接不可以嗎
<code>$_GET['id'] = 1001; $_GET['name'] = 'develop';</code>
dump($_REQUEST); 看看,數值前面要有參數名稱 形如/id/23
例:http://192.168.45.3:8125/home...
<code>array(2) { ["id"] => string(2) "23" ["_URL_"] => array(4) { [0] => string(4) "home" [1] => string(5) "index" [2] => string(2) "id" [3] => string(2) "23" } }</code>