>  기사  >  백엔드 개발  >  PHP 프레임워크 - thinkPHP URL은 $_GET[] 변수가 아닌 변수를 얻습니까?

PHP 프레임워크 - thinkPHP URL은 $_GET[] 변수가 아닌 변수를 얻습니까?

WBOY
WBOY원래의
2016-12-01 00:57:011189검색

'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>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.