cari

Rumah  >  Soal Jawab  >  teks badan

php框架 - thinkPHP url 中的 get 变量, ,不是 $_GET[] 变量吗?

当我开启 'URL_PARAMS_BIND_TYPE'=>1, //传参模式,允许顺序传参,也就是URL不写变量名

访问

http://localhost/yb1/Home/Get...

怎么啥也没有?

请问在thinkPHP 里怎么给 $_GET[""] 赋值?

    public function test($id  ,$name )
    {
        echo $_GET["id"] . "-" . $_GET["name"];
    } 
    
PHPzPHPz2896 hari yang lalu249

membalas semua(3)saya akan balas

  • PHPz

    PHPz2017-04-10 17:42:00

    这时候就需要上代码来解释这些神奇的问题啦.
    向下看(来自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进行赋值.

    balas
    0
  • 巴扎黑

    巴扎黑2017-04-10 17:42:00

    直接不可以吗

    $_GET['id'] = 1001;
    $_GET['name'] = 'develop';

    balas
    0
  • PHP中文网

    PHP中文网2017-04-10 17:42:00

    dump($_REQUEST); 看看,数值前面要有参数名 形如/id/23

    例:http://192.168.45.3:8125/home...

    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"
      }
    }

    balas
    0
  • Batalbalas