헤드라인 ThinkPHP5 프레임워크 그림(2): 애플리케이션 실행 프로세스 및 수명 주기

ThinkPHP5 프레임워크 그림(2): 애플리케이션 실행 프로세스 및 수명 주기

May 18, 2017 am 11:45 AM
thinkphp5

최신 ThinkPHP 5.0.8을 기반으로 원본 아이디어는 xmind 마인드맵 제작입니다. 그림이 선명하지 않다고 생각되면 xmind 소스 파일을 다운로드하여 xmind 소프트웨어로 열 수 있습니다.

또한 마인드맵에 사용된 소스코드는 모두 맵노트에 있으니 xmind 소스파일을 다운로드 하셔야만 보실 수 있습니다.

ThinkPHP5 개발을 스스로 배우고 싶은 학생이라면 이 혜택을 놓치지 마세요. 현재 ThinkPHP5 프로젝트 개발에 참여하고 있는 프로그래머들은 향후 참고를 위해 저장해 둘 수 있습니다

1. 마인드맵:

ThinkPHP5 프레임워크 그림(2): 애플리케이션 실행 프로세스 및 수명 주기

2. ThinkPHP5의 전체 설명을 텍스트 버전으로 제공 프레임워크 아키텍처 :

프레임워크 아키텍처

1 아키텍처 개요

1.1 MVC 디자인 패턴 기반

1.1.1 모델: 모델

1.1.2 보기:보기

1.1.3 컨트롤러: 컨트롤러

1.2 MVC 기반 URL 액세스 라우팅

1.2.1 http:/ /도메인 이름/ 항목 파일/모듈/컨트롤러/작업/매개 변수/값...


1.3 항목 파일

1.3.1 대부분 common: index .php

1.3.2 다음과 같은 다른 항목 파일을 모듈에 바인딩할 수 있습니다: admin.php

1.4 Application App

1.4.1 프레임워크 수명주기를 관리하는 개체: thinkApp 클래스

1.4.2 항목 파일에 의해 호출 및 실행

1.4.3 동일한 APP_PATH를 가진 애플리케이션 디렉토리는 동일한 것으로 간주됩니다. 애플리케이션

1.4.4 애플리케이션에는 프런트엔드의 index.php, 백엔드의 admin.php와 같이 여러 개의 입구가 있을 수 있습니다.

1.4.5 애플리케이션에는 자체적인 독립적인 구성 파일과 공용 함수 파일


1.5 모듈

1.5.1 애플리케이션은 일반적으로 여러 모듈로 구성됩니다

1.5.2 모듈은 일반적으로 응용 프로그램 디렉터리의 하위 디렉터리: app/index/

1.5.3 모듈은 일반적으로 여러 컨트롤러 클래스 파일로 구성됩니다.

1.5.4 간단한 응용 프로그램의 경우, 모듈 디렉토리를 생성할 필요가 없습니다. 단일 모듈 아키텍처를 사용하고 애플리케이션 구성에서 다중 모듈 지원을 끄십시오. 'app_multi_module'=>false

1.5.5 모듈은 자체 독립적인 모듈을 가질 수도 있습니다. 구성 파일, 공용 파일 및 클래스 라이브러리 파일


1.6 ControllerController

1.6.1 컨트롤러는 사용자 요청에 대한 응답, 모델 처리 호출, 뷰 출력을 선택하고 비즈니스 처리에 개입해서는 안 됩니다

1.6.2 각 컨트롤러는 실제로 클래스 파일입니다: Index.php

1.6.3 5.0부터 컨트롤러는 없이 정상적으로 작동할 수 있습니다. 상위 클래스 상속

<?php
namespace app\index\controller; class Index {
public function index()
   {
      return &#39;hello,thinkphp!&#39;;
   } 
}
로그인 후 복사


1.7 Action

1.7.1 컨트롤러에는 여러 작업 방법이 포함되며 작업 방법은 URL 액세스의 최소 단위입니다

1.7.2 작업 방법에 매개변수가 필요한 경우 $_GET 또는 $_POST를 전달해야 합니다.

<?php
namespace app\index\controller; class Index {
public function index() {
return &#39;index&#39;; } public function hello($name) {
return &#39;Hello,&#39;.$name; }
}
로그인 후 복사

1.8 모델 모델

1.8.1 실제 비즈니스 로직을 완성하고 데이터 캡슐화 및 형식 독립적인 데이터 반환

<🎜

1.9 보기 보기

1.9.1 모델 클래스를 호출하는 컨트롤러에서 반환되는 데이터는 패키징되어 다른 형식으로 반환되어야 합니다. 뷰 클래스에 의해.

1.9.2 필요에 따라 직접 렌더링할지 템플릿 출력을 사용할지 결정할 수 있습니다

1.9.3 뷰에는 컨트롤러의 작업에 해당하는 일련의 템플릿 파일이 있습니다

1.9.4 작업 방법에서 템플릿 디렉터리를 동적으로 설정할 수 있습니다.

1.10 네임스페이스 NameSpace

1.10.1 네임스페이스는 주로 다음에서 사용됩니다. 프레임워크의 클래스 라이브러리 파일

1.10.2 네임스페이스는 PSR-4의 자동 로딩 메커니즘을 준수해야 합니다. 공간 이름은 클래스의 경로에 해당합니다

2 라이프사이클

2.1 항목 파일 index.php

2.1.1 위치: public/index.php

2.1.2 항목 파일은 일반적으로 상수를 정의하고 프레임워크 부팅 파일을 로드합니다

<?php
// 应用入口文件
// 定义项目路径 
define(&#39;APP_PATH&#39;, __DIR__ . &#39;/../application/&#39;); 
// 加载框架引导文件 
require __DIR__ . &#39;/../thinkphp/start.php&#39;;
로그인 후 복사

2.2 부팅 파일: start.php

<?php
namespace think;
// ThinkPHP 引导文件
// 加载基础文件
require __DIR__ . &#39;/base.php&#39;;
// 执行应用
App::run()->send();
로그인 후 복사


2.2.1 base.php 로드

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2017 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

define(&#39;THINK_VERSION&#39;, &#39;5.0.5&#39;);
define(&#39;THINK_START_TIME&#39;, microtime(true));
define(&#39;THINK_START_MEM&#39;, memory_get_usage());
define(&#39;EXT&#39;, &#39;.php&#39;);
define(&#39;DS&#39;, DIRECTORY_SEPARATOR);
defined(&#39;THINK_PATH&#39;) or define(&#39;THINK_PATH&#39;, __DIR__ . DS);
define(&#39;LIB_PATH&#39;, THINK_PATH . &#39;library&#39; . DS);
define(&#39;CORE_PATH&#39;, LIB_PATH . &#39;think&#39; . DS);
define(&#39;TRAIT_PATH&#39;, LIB_PATH . &#39;traits&#39; . DS);
defined(&#39;APP_PATH&#39;) or define(&#39;APP_PATH&#39;, dirname($_SERVER[&#39;SCRIPT_FILENAME&#39;]) . DS);
defined(&#39;ROOT_PATH&#39;) or define(&#39;ROOT_PATH&#39;, dirname(realpath(APP_PATH)) . DS);
defined(&#39;EXTEND_PATH&#39;) or define(&#39;EXTEND_PATH&#39;, ROOT_PATH . &#39;extend&#39; . DS);
defined(&#39;VENDOR_PATH&#39;) or define(&#39;VENDOR_PATH&#39;, ROOT_PATH . &#39;vendor&#39; . DS);
defined(&#39;RUNTIME_PATH&#39;) or define(&#39;RUNTIME_PATH&#39;, ROOT_PATH . &#39;runtime&#39; . DS);
defined(&#39;LOG_PATH&#39;) or define(&#39;LOG_PATH&#39;, RUNTIME_PATH . &#39;log&#39; . DS);
defined(&#39;CACHE_PATH&#39;) or define(&#39;CACHE_PATH&#39;, RUNTIME_PATH . &#39;cache&#39; . DS);
defined(&#39;TEMP_PATH&#39;) or define(&#39;TEMP_PATH&#39;, RUNTIME_PATH . &#39;temp&#39; . DS);
defined(&#39;CONF_PATH&#39;) or define(&#39;CONF_PATH&#39;, APP_PATH); // 配置文件目录
defined(&#39;CONF_EXT&#39;) or define(&#39;CONF_EXT&#39;, EXT); // 配置文件后缀
defined(&#39;ENV_PREFIX&#39;) or define(&#39;ENV_PREFIX&#39;, &#39;PHP_&#39;); // 环境变量的配置前缀

// 环境常量
define(&#39;IS_CLI&#39;, PHP_SAPI == &#39;cli&#39; ? true : false);
define(&#39;IS_WIN&#39;, strpos(PHP_OS, &#39;WIN&#39;) !== false);

// 载入Loader类
require CORE_PATH . &#39;Loader.php&#39;;

// 加载环境变量配置文件
if (is_file(ROOT_PATH . &#39;.env&#39;)) {
    $env = parse_ini_file(ROOT_PATH . &#39;.env&#39;, true);
    foreach ($env as $key => $val) {
        $name = ENV_PREFIX . strtoupper($key);
        if (is_array($val)) {
            foreach ($val as $k => $v) {
                $item = $name . &#39;_&#39; . strtoupper($k);
                putenv("$item=$v");
            }
        } else {
            putenv("$name=$val");
        }
    }
}

// 注册自动加载
\think\Loader::register();

// 注册错误和异常处理机制
\think\Error::register();

// 加载惯例配置文件
\think\Config::set(include THINK_PATH . &#39;convention&#39; . EXT);
로그인 후 복사

2.2.1.1 시스템 상수 정의 로드

2.2.1.2 환경 변수 정의 파일 로드

2.2.1.3 자동 로딩 메커니즘 등록

2.2.1.3.1 Loader::register() 호출, 표준 클래스 라이브러리 및 타사 클래스 라이브러리 로드

2.2.1.3.2 자동으로 로드되는 콘텐츠

2.2.1.3 .2.1 등록 시스템의 자동 로딩 방법 thinkLoader::autoload

2.2.1.3.2.2 등록 시스템 네임스페이스 정의

2.2.1.3.2.3 클래스 라이브러리 매핑 파일 로드(존재하는 경우)

2.2.1.3.2.4 Composer가 설치되어 있는 경우 Composer를 자동 로딩하도록 등록

2.2.1.3.2.5 확장 확장 디렉터리 등록

2.2 .1.3.3 클래스 라이브러리 자동 로딩 감지 시퀀스

2.2.1.3.3.1 클래스 라이브러리 매핑 정의 여부

2.2.1.3.3.2 PSR-4 자동 로딩 감지

2.2.1.3.3.3 PSR-0 자동 로딩 감지

2.2.1.4 등록 오류 및 예외 처리 메커니즘

2.2.1.4.1 Execute Error::register() 등록, 이는 세 가지로 구성됩니다. parts

2.2.1.4.1.1 애플리케이션 종료 방법: thinkError::appShutdown

2.2.1.4.1.2 오류 처리 방법: thinkError::appError

2.2.1.4.1.3 예외 처리 방법: thinkError::appException

2.2.1.5 규칙 구성 파일 로드

2.2.1.5.1 thinkConfig::set(include THINK_PATH . 'convention' . EXT);

2.2.2 애플리케이션 실행: App::run( )->send();

2.2.2.1 App::run() 은 Request 객체를 입력하고 Response 객체를 반환합니다

2.2.2.2 Response::send():发送数据到客户端

2.3 应用初始化:App::initCommon()和init()方法

/**
     * 初始化应用
     */
    public static function initCommon()
    {
        if (empty(self::$init)) {
            // 初始化应用
            $config       = self::init();
            self::$suffix = $config[&#39;class_suffix&#39;];

            // 应用调试模式
            self::$debug = Env::get(&#39;app_debug&#39;, Config::get(&#39;app_debug&#39;));
            if (!self::$debug) {
                ini_set(&#39;display_errors&#39;, &#39;Off&#39;);
            } elseif (!IS_CLI) {
                //重新申请一块比较大的buffer
                if (ob_get_level() > 0) {
                    $output = ob_get_clean();
                }
                ob_start();
                if (!empty($output)) {
                    echo $output;
                }
            }

            // 注册应用命名空间
            self::$namespace = $config[&#39;app_namespace&#39;];
            Loader::addNamespace($config[&#39;app_namespace&#39;], APP_PATH);
            if (!empty($config[&#39;root_namespace&#39;])) {
                Loader::addNamespace($config[&#39;root_namespace&#39;]);
            }

            // 加载额外文件
            if (!empty($config[&#39;extra_file_list&#39;])) {
                foreach ($config[&#39;extra_file_list&#39;] as $file) {
                    $file = strpos($file, &#39;.&#39;) ? $file : APP_PATH . $file . EXT;
                    if (is_file($file) && !isset(self::$file[$file])) {
                        include $file;
                        self::$file[$file] = true;
                    }
                }
            }

            // 设置系统时区
            date_default_timezone_set($config[&#39;default_timezone&#39;]);

            // 监听app_init
            Hook::listen(&#39;app_init&#39;);

            self::$init = true;
        }
        return Config::get();
    }

    /**
     * 初始化应用或模块
     * @access public
     * @param string $module 模块名
     * @return array
     */
    private static function init($module = &#39;&#39;)
    {
        // 定位模块目录
        $module = $module ? $module . DS : &#39;&#39;;

        // 加载初始化文件
        if (is_file(APP_PATH . $module . &#39;init&#39; . EXT)) {
            include APP_PATH . $module . &#39;init&#39; . EXT;
        } elseif (is_file(RUNTIME_PATH . $module . &#39;init&#39; . EXT)) {
            include RUNTIME_PATH . $module . &#39;init&#39; . EXT;
        } else {
            $path = APP_PATH . $module;
            // 加载模块配置
            $config = Config::load(CONF_PATH . $module . &#39;config&#39; . CONF_EXT);
            // 读取数据库配置文件
            $filename = CONF_PATH . $module . &#39;database&#39; . CONF_EXT;
            Config::load($filename, &#39;database&#39;);
            // 读取扩展配置文件
            if (is_dir(CONF_PATH . $module . &#39;extra&#39;)) {
                $dir   = CONF_PATH . $module . &#39;extra&#39;;
                $files = scandir($dir);
                foreach ($files as $file) {
                    if (strpos($file, CONF_EXT)) {
                        $filename = $dir . DS . $file;
                        Config::load($filename, pathinfo($file, PATHINFO_FILENAME));
                    }
                }
            }

            // 加载应用状态配置
            if ($config[&#39;app_status&#39;]) {
                $config = Config::load(CONF_PATH . $module . $config[&#39;app_status&#39;] . CONF_EXT);
            }

            // 加载行为扩展文件
            if (is_file(CONF_PATH . $module . &#39;tags&#39; . EXT)) {
                Hook::import(include CONF_PATH . $module . &#39;tags&#39; . EXT);
            }

            // 加载公共文件
            if (is_file($path . &#39;common&#39; . EXT)) {
                include $path . &#39;common&#39; . EXT;
            }

            // 加载当前模块语言包
            if ($module) {
                Lang::load($path . &#39;lang&#39; . DS . Request::instance()->langset() . EXT);
            }
        }
        return Config::get();
    }
로그인 후 복사

2.3.1.1 定位模块目录

2.3.1.2 加载初始化文件

2.3.1.2.1 加载模块配置

2.3.1.2.2 读取数据库配置文件

2.3.1.2.3 读取扩展配置文件

2.3.1.2.4 加载应用状态配置

2.3.1.2.5 加载行为扩展文件

2.3.1.2.6 加载公共文件

2.3.1.2.7 加载当前模块语言包

2.3.2 检测应用调试模式:self::$debug = Env::get('app_debug', Config::get('app_debug'));

2.3.3 注册应用命名空间:self::$namespace = $config['app_namespace'];

2.3.4 加载额外文件:'extra_file_list'

2.3.5 设置系统时区:date_default_timezone_set($config['default_timezone']);

2.3.6 监听app_init: Hook::listen('app_init');

2.3.7 返回所有配置项:return Config::get();

2.4 URL访问检测:

2.4.1 PATH_INFO:http://serverName/index.php/index/index/hello/val/value

2.4.2 兼容方式:http://serverName/index.php?s=/index/index/hello&val=value

2.5 路由检测:App::routeCheck($request, array $config)与设置路由机制:route($route, $must = false)

/**
     * URL路由检测(根据PATH_INFO)
     * @access public
     * @param  \think\Request $request
     * @param  array          $config
     * @return array
     * @throws \think\Exception
     */
    public static function routeCheck($request, array $config)
    {
        $path   = $request->path();
        $depr   = $config[&#39;pathinfo_depr&#39;];
        $result = false;
        // 路由检测
        $check = !is_null(self::$routeCheck) ? self::$routeCheck : $config[&#39;url_route_on&#39;];
        if ($check) {
            // 开启路由
            if (is_file(RUNTIME_PATH . &#39;route.php&#39;)) {
                // 读取路由缓存
                $rules = include RUNTIME_PATH . &#39;route.php&#39;;
                if (is_array($rules)) {
                    Route::rules($rules);
                }
            } else {
                $files = $config[&#39;route_config_file&#39;];
                foreach ($files as $file) {
                    if (is_file(CONF_PATH . $file . CONF_EXT)) {
                        // 导入路由配置
                        $rules = include CONF_PATH . $file . CONF_EXT;
                        if (is_array($rules)) {
                            Route::import($rules);
                        }
                    }
                }
            }

            // 路由检测(根据路由定义返回不同的URL调度)
            $result = Route::check($request, $path, $depr, $config[&#39;url_domain_deploy&#39;]);
            $must   = !is_null(self::$routeMust) ? self::$routeMust : $config[&#39;url_route_must&#39;];
            if ($must && false === $result) {
                // 路由无效
                throw new RouteNotFoundException();
            }
        }
        if (false === $result) {
            // 路由无效 解析模块/控制器/操作/参数... 支持控制器自动搜索
            $result = Route::parseUrl($path, $depr, $config[&#39;controller_auto_search&#39;]);
        }
        return $result;
    }

    /**
     * 设置应用的路由检测机制
     * @access public
     * @param  bool $route 是否需要检测路由
     * @param  bool $must  是否强制检测路由
     * @return void
     */
    public static function route($route, $must = false)
    {
        self::$routeCheck = $route;
        self::$routeMust  = $must;
    }
}
로그인 후 복사

2.5.1 路由到模块/控制器/操作

2.5.2 路由到外部重定向地址;

2.5.3 路由到控制器方法;

2.5.4 路由到闭包函数;

2.5.5 路由到类的方法;

2.6 请求分发与响应输出:Response::send()

2.6.1 控制器的所有操作方法都是 return 返回而不是直接输出

2.6.2 自动转换成 default_return_type 参数配置的格式

2.7 应用结束,写入日志

2.7.1 系统的日志包括用户调试输出的和系统自动生成的日志,统一会在应用结束的时候进行写入操作

2.7.2 日志的写入操作受日志初始化的影响

3 入口文件

3.1 采用单一入口模式进行项目部署(并非唯一入口)

3.2 不同应用对应不同入口,但入口文件内容和功能基本一致

3.3 入口文件内容

<?php
// 定义应用目录 
define(&#39;APP_PATH&#39;, __DIR__ . &#39;/../application/&#39;); 
// 加载框架引导文件 
require __DIR__ . &#39;/../thinkphp/start.php&#39;;
로그인 후 복사

3.3.1 定义应用目录:define('APP_PATH', __DIR__ . '/../application/');

3.3.2 定义系统常量:define('CONF_PATH', __DIR__ . '/../config/');

3.3.3 加载框架引导文件: require __DIR__ . '/../thinkphp/start.php';

3.4 入口文件位于public目录下

3.4.1 这是为了让应用部署更安全

3.4.2 public必须是Web可访问目录

3.4.3 其实文件或目录应该放在非Web访问目录下面


4 URL访问

4.1 URL设计

4.1.1 PATH_INFO:http://index.php/模块/控制器/操作/[参数名/参数值...]

4.1.2 兼容模型:http://index.php?s=/模块/控制器/操作/[参数名/参数值...]

4.1.3 不支持普通URL模式,但传参可以:http://index.php/module/controller/action?id=10

4.1.4 URL默认不区分大小写,都会转为小写的,控制器部分自动转为驼峰法处理

4.2 隐藏入口文件

4.2.1 隐藏入口文件,可优化URL,网站更安全

4.2.2 在入口文件同级:public/.htaccess

4.2.3 Apache配置文件httpd.conf加载:mod_rewrite.so模块,支持URL重写

4.2.4 httpd.conf:AllowOverride None 将None设置为 All


5 模块设计

5.1 默认为多模块,支持单一模块设计

5.2 模块命名空间均为app为根空间

5.3 模块可以看作是类库的集合:控制器类,模型类

5.4 模块类库:app\模块名\类库\类名

5.5 入口文件中隐藏模块和控制器


由于默认是采用多模块的支持,所以多个模块的情况下必须在URL地址中标识当前模块,如果只有一个模块的 话,可以进行模块绑定,方法是应用的入口文件中添加如下代码:

// 绑定当前访问到index模块 define('BIND_MODULE','index');

绑定后,我们的URL访问地址则变成:

http://serverName/index.php/控制器/操作/[参数名/参数值...]

访问的模块是 index 模块。 如果你的应用比较简单,模块和控制器都只有一个,那么可以在应用公共文件中绑定模块和控制器,如下:

// 绑定当前访问到index模块的index控制器 define('BIND_MODULE','index/index');

设置后,我们的URL访问地址则变成:

http://serverName/index.php/操作/[参数名/参数值...]

访问的模块是 index 模块,控制器是 Index 控制器。

5.5.1 绑定当前访问的模块:define('BIND_MODULE','index');

5.5.2 绑定当前访问的模块和控制器:define('BIND_MODULE','userlogin/getname');

5.6 单一模块设计:'app_multi_module'=>false,

5.6.1 可以把应用目录当作模块目录

5.6.2 模块中的控制器命名空间也要调整

6 命名空间

6.1 命名空间的路径与类库文件的目录一致,可以实现类的自动加载(惰性加载)

6.2 根命名空间:类库包

6.2.1 think:系统核心类库 (think/library/think)

6.2.2 traits:系统trait类库(think/library/traits)

6.2.3 app:应用类库(application)

6.2.4 自定义根命名空间

6.2.4.1 默认加载EXTEND_APTH目录中的类库,目录名为根

我们只需要把自己的类库包目录放入 EXTEND_PATH 目录(默认为 extend ,可配置),就可以自动注册对 应的命名空间,例如:

我们在 extend 目录下面新增一个 my 目录,然后定义一个 \my\Hello 类( 类文件位于 extend/my/Hello.php )如下:

<?php
namespace my;
class Hello
{
  public function  index()
  {
    return &#39;hello tp5&#39;;
  }
}
로그인 후 복사

我们就可以在控制器中,直接实例化和调用:

<?php
namespace app\index\controller;
class Index
{
    public function index()
    {
      $obj = new \my\Hello();
       return   $obj->index();
    }
}
로그인 후 복사

6.2.4.2 可在入口文件中重新定义:define('EXTEND_PATH','../vendor/');

6.2.4.3 手动注册根命名空间

6.2.4.3.1 应用公共文件:common.php中添加如代码:

在应用公共文件中添加下面的代码:

\think\Loader::addNamespace(&#39;my&#39;,&#39;../application/extend/my/&#39;);
로그인 후 복사

如果要同时注册多个根命名空间,可以使用:

\think\Loader::addNamespace([ &#39;my&#39; => &#39;../application/extend/my/&#39;, &#39;org&#39; => &#39;../application/extend/org/&#39;, ]);
로그인 후 복사

6.2.4.3.2 应用配置文件:config.php中添加:

可以直接在应用的配置文件中添加配置,系统会在应用执行的时候自动注册。

&#39;root_namespace&#39; => [ &#39;my&#39; => &#39;../application/extend/my/&#39;, &#39;org&#39; => &#39;../application/extend/org/&#39;, ]
로그인 후 복사

6.3 可以给命名空间创建别名

6.3.1 应用公共文件common.php


7 trait引入

7.1 trait提供了一种代码复用机制,是类的公共方法集,与继承相比,相当于横向扩展了类的功能

7.2 PHP5.4使用load_trait()引入,PHP5.5以上可以直接自动加载

但由于PHP5.4版本不支持 trait 的自动加载,因此如果是PHP5.4版本,必须手动导入 trait 类库,系统 提供了一个助手函数 load_trait ,用于自动加载 trait 类库,例如,可以这样正确引入 trait 类库。

namespace app\index\controller; load_trait(&#39;controller/Jump&#39;); class index {
// 引入traits\controller\Jump
use \traits\controller\Jump; public function index() {
$this->assign(&#39;name&#39;,&#39;value&#39;);
$this->show(&#39;index&#39;); }
}
로그인 후 복사

如果你的PHP版本大于 5.5 的话,则可以省略 load_trait 函数引入 trait 。

namespace app\index\controller; class index {
use \traits\controller\Jump;
public function index()
{
}
 }
로그인 후 복사

可以支持同时引入多个 trait 类库,例如:

namespace app\index\controller; load_trait(&#39;controller/Other&#39;); load_trait(&#39;controller/Jump&#39;); class index
{
use \traits\controller\Other; use \traits\controller\Jump; public function index() { }
}
로그인 후 복사

或者使用

namespace app\index\controller; load_trait(&#39;controller/Other&#39;); load_trait(&#39;controller/Jump&#39;); class index {
use \traits\controller\Other,\traits\controller\Jump;
public function index()
{
} 
}
로그인 후 복사


7.3 trait命名冲突的解决方案

7.3.1 insteadof:冲突时指定使用哪一个trait类

7.3.2 as:将另一个冲突的trait类以别名的方式访问

8 API友好

8.1 数据输出

8.1.1 控制器中数据输出统一用Response类处理,并不直接输出

8.1.2 设置 default_return_type 或者动态设置不同类型的 Response 输出就可以自动进行数据转换

8.1.3 大多数情况下,你只需要在控制器中返回字符串或者数组即可

8.1.4 默认为html,可在配置文件中:'default_return_type'=>'json'

8.2 错误调试


8.2.1 Trace 调试功能支持 Socket 在内的方 式,可以实现远程的开发调试


三、ThinkPHP5框架思维导图下载地址:

ThinkPHP5 프레임워크 그림(2): 애플리케이션 실행 프로세스 및 수명 주기2框架架构.xmind.zip

【相关推荐】

1. 图解ThinkPHP5框架(一):基础知识,开发规范与目录结构

2. 图解ThinkPHP5框架(三):配置类Config.php源码解读

3. 2017年最新的10个thinkphp视频教程推荐

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Pagoda에 thinkphp5를 배포할 때 오류가 발생하면 어떻게 해야 합니까? Pagoda에 thinkphp5를 배포할 때 오류가 발생하면 어떻게 해야 합니까? Dec 19, 2022 am 11:04 AM

Pagoda에 thinkphp5를 배포할 때 보고된 오류에 대한 해결 방법: 1. Pagoda 서버를 열고 php pathinfo 확장을 설치하고 활성화합니다. 2. "RewriteRule ^(.*)$ index.php 콘텐츠로 ".access" 파일을 구성합니다. ?s=/$1 [QSA ,PT,L]”; 3. 웹사이트 관리에서 thinkphp의 pseudo-static을 활성화하면 됩니다.

thinkphp5 URL 재작성이 실패하면 어떻게 해야 합니까? thinkphp5 URL 재작성이 실패하면 어떻게 해야 합니까? Dec 12, 2022 am 09:31 AM

thinkphp5 URL 재작성이 작동하지 않는 해결 방법: 1. mod_rewrite.so 모듈이 httpd.conf 구성 파일에 로드되었는지 확인합니다. 2. AllowOverride None에서 None을 All로 변경합니다. 3. Apache 구성 파일 .htaccess를 "RewriteRule ^ (.*)$ index.php [L,E=PATH_INFO:$1]" 하고 저장하세요.

thinkphp5에서 요청된 URL을 얻는 방법 thinkphp5에서 요청된 URL을 얻는 방법 Dec 20, 2022 am 09:48 AM

요청된 URL을 얻는 thinkphp5의 방법: 1. 현재 URL 정보를 얻기 위해 "\think\Request" 클래스의 "$request = Request::instance();" 방법을 사용합니다. 도메인 이름을 포함한 전체 URL 주소를 얻으려면 "$request-> url()" 함수를 사용하세요.

thinkphp5 게시물이 값을 얻을 수 없으면 어떻게 해야 합니까? thinkphp5 게시물이 값을 얻을 수 없으면 어떻게 해야 합니까? Dec 06, 2022 am 09:29 AM

thinkphp5 게시물은 TP5가 strpos 함수를 사용하여 헤더의 콘텐츠 유형 값에서 app/json 문자열을 찾기 때문에 값을 얻을 수 없습니다. 해결 방법은 헤더의 콘텐츠 유형 값을 app/json으로 설정하는 것입니다.

thinkphp5 제목 표시줄 아이콘을 제거하는 방법 thinkphp5 제목 표시줄 아이콘을 제거하는 방법 Dec 20, 2022 am 09:24 AM

thinkphp5 제목 표시줄 아이콘을 제거하는 방법: 1. thinkphp5 프레임워크 공개에서 favicon.ico 파일을 찾습니다. 2. 파일을 삭제하거나 다른 사진을 선택하여 이름을 favicon.ico로 바꾸고 원본 favicon.ico 파일을 대체합니다.

thinkphp5에서 컨트롤러가 존재하지 않는다는 메시지가 표시되면 어떻게 해야 합니까? thinkphp5에서 컨트롤러가 존재하지 않는다는 메시지가 표시되면 어떻게 해야 합니까? Dec 06, 2022 am 10:43 AM

컨트롤러가 존재하지 않는다고 메시지를 표시하는 thinkphp5에 대한 해결 방법: 1. 해당 컨트롤러의 네임스페이스가 올바르게 작성되었는지 확인하고 올바른 네임스페이스로 변경합니다. 2. 해당 tp 파일을 열고 클래스 이름을 수정합니다.

ThinkPHP5에서 어제의 데이터를 쿼리하는 방법 ThinkPHP5에서 어제의 데이터를 쿼리하는 방법 Dec 05, 2022 am 09:20 AM

ThinkPHP5에서 어제의 데이터를 쿼리하는 방법: 1. ThinkPHP5 관련 파일을 엽니다. 2. "db('table')->whereTime('c_time', 'yesterday')->select();" 표현식을 통해 어제의 데이터를 쿼리할 수 있습니다. .

thinkphp5에서 오류 프롬프트를 설정하는 방법 thinkphp5에서 오류 프롬프트를 설정하는 방법 Dec 07, 2022 am 10:31 AM

thinkphp5에서 오류 프롬프트를 설정하는 방법: 1. 프로젝트 루트 디렉터리에 있는 public 폴더를 입력하고 index.php 항목 파일을 엽니다. 2. 디버그 모드 스위치에 대한 설명을 봅니다. 3. "APP_DEBUG" 상수 값을 조정합니다. 오류 메시지 프롬프트를 표시하려면 true로 설정합니다.