当前位置: 首页 > news >正文

网站建设公司小程序/谷歌商店安卓版下载

网站建设公司小程序,谷歌商店安卓版下载,怎么给网站做seo,杭州哪家做外贸网站好我一直对于thinkphp5的加载运行的时候做了什么&#xff0c;他是怎么自动加载类的&#xff0c;是和composer一样的吗—能否实现运行时再加载类&#xff0c;于是做了一下测试&#xff0c;追踪了整个加载流程。 以文件为单位进行讲解&#xff1a; 入口文件index.php <?php …

我一直对于thinkphp5的加载运行的时候做了什么,他是怎么自动加载类的,是和composer一样的吗—能否实现运行时再加载类,于是做了一下测试,追踪了整个加载流程。

以文件为单位进行讲解:

入口文件index.php

<?php
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

1. 定义了APP_PATH常量

2. 加载start.php文件

 

start.php文件

<?php
namespace think;// ThinkPHP 引导文件
// 加载基础文件
require __DIR__ . '/base.php';
// 执行应用
App::run()->send();

 

1. 加载base.php

2. 执行App类的静态方法run(),再执行返回值的send()方法

来到这里,出现两个问题,App类。。。是从哪里加载进来的呢?看看base.php

 

base.php文件

<?php
define('THINK_VERSION', '5.0.3');
define('THINK_START_TIME', microtime(true));
define('THINK_START_MEM', memory_get_usage());
define('EXT', '.php');
define('DS', DIRECTORY_SEPARATOR);
defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS);
define('LIB_PATH', THINK_PATH . 'library' . DS);
define('CORE_PATH', LIB_PATH . 'think' . DS);
define('TRAIT_PATH', LIB_PATH . 'traits' . DS);
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS);
defined('ROOT_PATH') or define('ROOT_PATH', dirname(realpath(APP_PATH)) . DS);
defined('EXTEND_PATH') or define('EXTEND_PATH', ROOT_PATH . 'extend' . DS);
defined('VENDOR_PATH') or define('VENDOR_PATH', ROOT_PATH . 'vendor' . DS);
defined('RUNTIME_PATH') or define('RUNTIME_PATH', ROOT_PATH . 'runtime' . DS);
defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS);
defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH . 'cache' . DS);
defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'temp' . DS);
defined('CONF_PATH') or define('CONF_PATH', APP_PATH); // 配置文件目录
defined('CONF_EXT') or define('CONF_EXT', EXT); // 配置文件后缀
defined('ENV_PREFIX') or define('ENV_PREFIX', 'PHP_'); // 环境变量的配置前缀// 环境常量
define('IS_CLI', PHP_SAPI == 'cli' ? true : false);
define('IS_WIN', strpos(PHP_OS, 'WIN') !== false);// 载入Loader类
require CORE_PATH . 'Loader.php';// 加载环境变量配置文件
if (is_file(ROOT_PATH . '.env')) {$env = parse_ini_file(ROOT_PATH . '.env', true);foreach ($env as $key => $val) {$name = ENV_PREFIX . strtoupper($key);if (is_array($val)) {foreach ($val as $k => $v) {$item = $name . '_' . strtoupper($k);putenv("$item=$v");}} else {putenv("$name=$val");}}
}// 注册自动加载
\think\Loader::register();// 注册错误和异常处理机制
\think\Error::register();// 加载惯例配置文件
\think\Config::set(include THINK_PATH . 'convention' . EXT);

1. 定义了许多常量

2. 载入Loader类

3. 查看有无“环境变量配置文件”,有的话就加载

4. 运行Loader类的register()方法

5. 运行Error类的register()方法

 

从上下文以及注释可以知道,应该是Loader类的静态方法register()方法,实现了类的自动加载。重点就是它了。

 

Loader类的静态方法register()方法
 

// 注册自动加载机制
public static function register($autoload = '')
{// 注册系统自动加载spl_autoload_register($autoload ?: 'think\\Loader::autoload', true, true);// 注册命名空间定义self::addNamespace(['think'    => LIB_PATH . 'think' . DS,'behavior' => LIB_PATH . 'behavior' . DS,'traits'   => LIB_PATH . 'traits' . DS,]);// 加载类库映射文件if (is_file(RUNTIME_PATH . 'classmap' . EXT)) {self::addClassMap(__include_file(RUNTIME_PATH . 'classmap' . EXT));}// Composer自动加载支持if (is_dir(VENDOR_PATH . 'composer')) {self::registerComposerLoader();}// 自动加载extend目录self::$fallbackDirsPsr4[] = rtrim(EXTEND_PATH, DS);
}

1. 默认$autoload为空,使用PHP内置函数spl_autoload_register注册Loader类的静态方法autoload()方法为自动加载机制。

其意思即是,当使用类的时候,找不到类或者还没有包含,会将类名传给autoload()方法,让它处理

2. 注册命名空间定义,是将命名空间与真实的文件路径对应一一对应,并且存储在一个类静态变量数组里面。

其作用是,在autoload()方法接收到类的名字的时候,通过类所属的命名空间,找到类文件的真实路径,进而将类文件包含include

3. 以下的基本是一样的加载,只不过不是加载框架自身的类文件,而是加载composer库或者自己写的类

 

autoload()方法

// 自动加载
public static function autoload($class)
{// 检测命名空间别名if (!empty(self::$namespaceAlias)) {$namespace = dirname($class);if (isset(self::$namespaceAlias[$namespace])) {$original = self::$namespaceAlias[$namespace] . '\\' . basename($class);if (class_exists($original)) {return class_alias($original, $class, false);}}}if ($file = self::findFile($class)) {// Win环境严格区分大小写if (IS_WIN && pathinfo($file, PATHINFO_FILENAME) != pathinfo(realpath($file), PATHINFO_FILENAME)) {return false;}__include_file($file);return true;}
}

如你所见,autoload方法就是接收类名,搜索类文件,包含类文件。

 

恩,至此Thinkphp5运行时加载类的流程已经明了。

总结一下,index.php加载start.php,在start.php里面加载base.php(类自动加载机制就在这里出现了),然后下面调用App的静态方法run方法执行“模块/控制器/操作”,返回Respose类的实例执行send方法,将响应数据发送给客户端,这样,一个完整的请求就完成了。
 

http://www.jmfq.cn/news/5072509.html

相关文章:

  • 博彩游戏网站开发设计菲律宾/国际时事新闻最新消息
  • 灵宝网站建设/网站关键词排名服务
  • 个人网站模板 php/优化营商环境 提升服务效能
  • 网站开发报价清单/seo外链工具下载
  • 网站制作致谢词/百度纯净版首页入口
  • wordpress影院插件/网站推广专家十年乐云seo
  • 秦皇岛建设局官方网站/网络营销师证书含金量
  • 局域网中怎么访问自己做的网站/宁波seo网络推广渠道介绍
  • 贵州省建设厅官网站首页/前端培训
  • 长春优惠做网站/seo搜索
  • 设计类网站app/网页版百度
  • 成都网站制作系统/手机百度助手
  • 界面设计心得/青岛网站优化
  • 公众号做视频网站吗/社群营销方案
  • 网站开发运营成本/seo上首页排名
  • 北京网站建设哪家最好/免费推客推广平台
  • 郑州网站建设推广优化/苏州百度推广代理商
  • 东方城乡与住房建设部网站/百度指数官网登录
  • 我想来做外贸网站来推广/品牌营销方案
  • 营销网站建设定制/网页制作接单平台
  • 网站开发常用工具/外贸营销系统
  • 硬件开发前景/seo助理
  • No物流网站建设/最近三天发生的重要新闻
  • 对网页美工的认识/seo优化操作
  • 企业网站用什么程序好/营业推广方式
  • 龙岗网站建设深圳信科/软文编辑器
  • 网页制作基础教程直播/成都官网seo厂家
  • 相册网站模板/郑州网络营销公司
  • 最好的网站统计/seo到底是做什么的
  • 百度网址提交/seo教程自学网