84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
当我开启 'URL_PARAMS_BIND_TYPE'=>1, //传参模式,允许顺序传参,也就是URL不写变量名
访问
http://localhost/yb1/Home/Get...
怎么啥也没有?
请问在thinkPHP 里怎么给 $_GET[""] 赋值?
public function test($id ,$name ) { echo $_GET["id"] . "-" . $_GET["name"]; }
这时候就需要上代码来解释这些神奇的问题啦.向下看(来自ThinkPHPLibraryThinkDispatcher.class.php 211行):
$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); }
代码中首先会把url中的路径信息切割,也就是Getpost/test/2/xxx这一部分,而其中在前面的获取控制器阶段,会把Getpost/test进行移除,最后到了URL参数绑定的过程中,就会直接将paths数据赋值给var,然后在于$_GET数组进行合并,所以,在$_GET数组中是只存在值,而不存在楼主要的键的,因为TP并不知道你要绑定的是哪个键.
关于如何绑定,那就继续看代码:向下看(来自ThinkPHPLibraryThinkApp.class.php 136行):
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);
以上就是绑定参数的代码,其中当URL_PARAMS_BIND_TYPE为true时,他就会将路径参数依次弹出给函数的参数,然后在利用invokeArgs进行赋值.
这时候就需要上代码来解释这些神奇的问题啦.
向下看(来自ThinkPHPLibraryThinkDispatcher.class.php 211行):
代码中首先会把url中的路径信息切割,也就是Getpost/test/2/xxx这一部分,而其中在前面的获取控制器阶段,会把Getpost/test进行移除,最后到了URL参数绑定的过程中,就会直接将paths数据赋值给var,然后在于$_GET数组进行合并,所以,在$_GET数组中是只存在值,而不存在楼主要的键的,因为TP并不知道你要绑定的是哪个键.
关于如何绑定,那就继续看代码:
向下看(来自ThinkPHPLibraryThinkApp.class.php 136行):
以上就是绑定参数的代码,其中当URL_PARAMS_BIND_TYPE为true时,他就会将路径参数依次弹出给函数的参数,然后在利用invokeArgs进行赋值.