0

0

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

php中文网

php中文网

发布时间:2016-12-01 00:57:01

|

1360人浏览过

|

来源于php中文网

原创

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

立即学习PHP免费学习笔记(深入)”;

访问

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

怎么啥也没有?

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

Endel.io
Endel.io

Endel是一款可以创造个性化舒缓声音的应用程序,可帮助您集中注意力、放松身心和入睡。

下载
    public function test($id  ,$name )
    {
        echo $_GET["id"] . "-" . $_GET["name"];
    } 
    

回复内容:

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

立即学习PHP免费学习笔记(深入)”;

访问

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进行赋值.

直接不可以吗

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

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

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
vlookup函数使用大全
vlookup函数使用大全

本专题整合了vlookup函数相关 教程,阅读专题下面的文章了解更多详细内容。

26

2025.12.30

金山文档相关教程
金山文档相关教程

本专题整合了金山文档相关教程,阅读专题下面的文章了解更多详细操作。

28

2025.12.30

PS反选快捷键
PS反选快捷键

本专题整合了ps反选快捷键介绍,阅读下面的文章找到答案。

25

2025.12.30

表格中一行两行的方法
表格中一行两行的方法

本专题整合了表格中一行两行的相关教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.30

cpu温度过高解决方法大全
cpu温度过高解决方法大全

本专题整合了cpu温度过高相关教程,阅读专题下面的文章了解更多详细内容。

5

2025.12.30

ASCII码介绍
ASCII码介绍

本专题整合了ASCII码相关内容,阅读专题下面的文章了解更多详细内容。

31

2025.12.30

GPS是什么
GPS是什么

本专题整合了GPS相关内容,阅读专题下面的文章了解更多详细内容。

3

2025.12.30

wifi拒绝接入
wifi拒绝接入

本专题整合了wifi拒绝接入相关教程,阅读下面的文章了解更多详细方法。

9

2025.12.30

丰网速运介绍
丰网速运介绍

本专题整合了丰网速运查询入口以及相关内容,阅读专题下面的文章了解更多内容。

3

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号