'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 배열에는 값만 있고 호스트의 기본 키는 없습니다. 어떤 키를 바인딩할지 알아보세요.
바인딩 방법에 대해서는 계속해서 코드를 살펴보세요.
아래로 살펴보기(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>