php框架-thinkPHPurl中的get变量,,不是$_GET[]变量吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php框架-thinkPHPurl中的get变量,,不是$_GET[]变量吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3134字,纯文字阅读大概需要5分钟。
内容图文
当我开启 'URL_PARAMS_BIND_TYPE'=>1, //传参模式,允许顺序传参,也就是URL不写变量名访问
http://localhost/yb1/Home/Get...
怎么啥也没有?
请问在thinkPHP 里怎么给 $_GET[""] 赋值?
public function test($id ,$name )
{
echo $_GET["id"] . "-" . $_GET["name"];
}
回复内容:
当我开启 '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进行赋值.
直接不可以吗
$_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框架-thinkPHPurl中的get变量,,不是$_GET[]变量吗?全部内容,希望文章能够帮你解决php框架-thinkPHPurl中的get变量,,不是$_GET[]变量吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。