从ThinkPHP框架核心讨论C、E、G、L、T、I、N...等函数
如果只是从了解怎么用这几函数的角度看,直接看官方发布的文档即可!但是要了解这些函数是怎么被ThinkPHP框架定义调用的,那需要另外一番讨 论了。还好,ThinkPHP官方在源码力做了很好的注释,通过一步步探索我发现只要你找到代码的定义位置,你就能更精确的把握其应用,甚至不用读代码, 官方的代码注释就能帮你很好的理解。废话不多说,来看我找的框架执行代码的几个位置:
首先,从入口文件index.php里面看到框架的执行通过“require './ThinkPHP/ThinkPHP.php';”执行,打开这个文件,看里面的start() 方法:
................................
static public function start() {
// 注册AUTOLOAD方法
spl_autoload_register('Think\Think::autoload');
// 设定错误和异常处理
register_shutdown_function('Think\Think::fatalError');
set_error_handler('Think\Think::appError');
set_exception_handler('Think\Think::appException');
// 初始化文件存储方式
Storage::connect(STORAGE_TYPE);
$runtimefile = RUNTIME_PATH.APP_MODE.'~runtime.php';
if(!APP_DEBUG && Storage::has($runtimefile)){
Storage::load($runtimefile);
}else{
if(Storage::has($runtimefile))
Storage::unlink($runtimefile);
$content = '';
// 读取应用模式
$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';
// 加载核心文件
/*Array
(
[0] => C:\wamp\www\onthink\ThinkPHP/Common/functions.php
[1] => ./Application/Common/Common/function.php
[2] => C:\wamp\www\onthink\ThinkPHP\Library/Think/Hook.class.php
[3] => C:\wamp\www\onthink\ThinkPHP\Library/Think/App.class.php
[4] => C:\wamp\www\onthink\ThinkPHP\Library/Think/Dispatcher.class.php
[5] => C:\wamp\www\onthink\ThinkPHP\Library/Think/Route.class.php
[6] => C:\wamp\www\onthink\ThinkPHP\Library/Think/Controller.class.php
[7] => C:\wamp\www\onthink\ThinkPHP\Library/Think/View.class.php
[8] => C:\wamp\www\onthink\ThinkPHP\Library/Behavior/ParseTemplateBehavior.class.php
[9] => C:\wamp\www\onthink\ThinkPHP\Library/Behavior/ContentReplaceBehavior.class.php
)
*/
foreach ($mode['core'] as $file){
if(is_file($file)) {
include $file;
if(!APP_DEBUG) $content .= compile($file);
}
}
// 加载应用模式配置文件
foreach ($mode['config'] as $key=>$file){
is_numeric($key)?C(include $file):C($key,include $file);
}
// 读取当前应用模式对应的配置文件
if('common' != APP_MODE && is_file(CONF_PATH.'config_'.APP_MODE.'.php'))
C(include CONF_PATH.'config_'.APP_MODE.'.php');
// 加载模式别名定义
if(isset($mode['alias'])){
self::addMap(is_array($mode['alias'])?$mode['alias']:include $mode['alias']);
}
// 加载应用别名定义文件
if(is_file(CONF_PATH.'alias.php'))
self::addMap(include CONF_PATH.'alias.php');
// 加载模式行为定义
if(isset($mode['tags'])) {
Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']);
}
// 加载应用行为定义
if(is_file(CONF_PATH.'tags.php'))
// 允许应用增加开发模式配置定义
Hook::import(include CONF_PATH.'tags.php');
// 加载框架底层语言包
L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php');
if(!APP_DEBUG){
$content .= "\nnamespace { Think\Think::addMap(".var_export(self::$_map,true).");";
$content .= "\nL(".var_export(L(),true).");\nC(".var_export(C(),true).');Think\Hook::import('.var_export(Hook::get(),true).');}';
Storage::put($runtimefile,strip_whitespace('<?php '.$content));
}else{
// 调试模式加载系统默认的配置文件
C(include THINK_PATH.'Conf/debug.php');
// 读取应用调试配置文件
if(is_file(CONF_PATH.'debug.php'))
C(include CONF_PATH.'debug.php');
}
}
上 面那个打印出来的数组是我加上去的,可以看出来,这个数组就是ThinkPHP加载的核心文件,其中包括 “ThinkPHP/Common/functions.php”和“ ./Application/Common/Common/function.php”;在前面的functions.php文件里面会发现各种函数库:
/**
* 获取和设置配置参数 支持批量定义
* @param string|array $name 配置变量
* @param mixed $value 配置值
* @param mixed $default 默认值
* @return mixed
*/
function C($name=null, $value=null,$default=null) {
static $_config = array();
// 无参数时获取所有
if (empty($name)) {
return $_config;
}
// 优先执行设置获取或赋值
if (is_string($name)) {
if (!strpos($name, '.')) {
$name = strtolower($name);
if (is_null($value))
return isset($_config[$name]) ? $_config[$name] : $default;
$_config[$name] = $value;
return;
}
// 二维数组设置和获取支持
$name = explode('.', $name);
$name[0] = strtolower($name[0]);
if (is_null($value))
return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : $default;
$_config[$name[0]][$name[1]] = $value;
return;
}
// 批量设置
if (is_array($name)){
$_config = array_merge($_config, array_change_key_case($name));
return;
}
return null; // 避免非法参数
}
/**
* 抛出异常处理
* @param string $msg 异常消息
* @param integer $code 异常代码 默认为0
* @return void
*/
function E($msg, $code=0) {
throw new Think\Exception($msg, $code);
}
/**
* 记录和统计时间(微秒)和内存使用情况
* 使用方法:
* <code>
* G('begin'); // 记录开始标记位
* // ... 区间运行代码
* G('end'); // 记录结束标签位
* echo G('begin','end',6); // 统计区间运行时间 精确到小数后6位
* echo G('begin','end','m'); // 统计区间内存使用情况
* 如果end标记位没有定义,则会自动以当前作为标记位
* 其中统计内存使用需要 MEMORY_LIMIT_ON 常量为true才有效
* </code>
* @param string $start 开始标签
* @param string $end 结束标签
* @param integer|string $dec 小数位或者m
* @return mixed
*/
function G($start,$end='',$dec=4) {
static $_info = array();
static $_mem = array();
if(is_float($end)) { // 记录时间
$_info[$start] = $end;
}elseif(!empty($end)){ // 统计时间和内存使用
if(!isset($_info[$end])) $_info[$end] = microtime(TRUE);
if(MEMORY_LIMIT_ON && $dec=='m'){
if(!isset($_mem[$end])) $_mem[$end] = memory_get_usage();
return number_format(($_mem[$end]-$_mem[$start])/1024);
}else{
return number_format(($_info[$end]-$_info[$start]),$dec);
}
}else{ // 记录时间和内存使用
$_info[$start] = microtime(TRUE);
if(MEMORY_LIMIT_ON) $_mem[$start] = memory_get_usage();
}
}
当然,C、E、G、L、T、I、N...等函数也在其中,呵呵 是不是发现不止这些函数的定义,这里的资源只要了解就能精确把握应用;至于每个函数的用法不在多说......
制作人:飞虎 无兄弟不编程!
=====================================================================================
欢迎加QQ群进行更多交流:305397511 专注于php、mysql、jquery以及开源框架
转载于:https://www.cnblogs.com/jishume/articles/3779571.html
从ThinkPHP框架核心讨论C、E、G、L、T、I、N...等函数相关推荐
- php tp框架调用方法,thinkPHP框架使用方法
title: thinkPHP框架使用方法 date: 2018-01-05 20:30:44 tags: 1. thinkPHP思想 thinkPHP基于MVC思想,MVC是一种设计模式,他强制的使 ...
- 国内电商系统为什么要以ThinkPHP为核心开发
导读:目前我们看到国内很多企业的电商系统以thinkphp为核心来开发,尤其是面向API开发.支持PHP7的thinkphp5.1发布以来,国内中小企业更是对thinkphp更加推崇,大家为什么要这样 ...
- thinkphp框架的使用
ThinkPhp知识大全(非常详细) 转载文章,感觉写的非常好 thinkphp.cn thinkphp 3.2版本 [框架项目部署] 部署一个Shop项目,使用tp框架 步骤: 创建入口文件: 1. ...
- Sg.js框架核心概念
Sg.js框架核心概念: 1)所有变量.方法.类对象全部都是从属于$g主树,由$g分支出很多$g.变量名.$g.方法.$g.对象id.$g.类: 2)获取控件内部属性必须使用公开的get方法获取,禁止 ...
- thinkphp 框架自动加载原理_ThinkPHP5分析Part 1 基本框架流程
ThinkPHP是一个免费开源的,快速.简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的.ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能 ...
- 【ThinkPHP系列篇】ThinkPHP框架的介绍和搭建(一)
各位博友好,最近博主学了关于ThinkPHP的一些基本操作,感觉很有收获,所以作为小白的我想与大家分享一些关于ThinkPHP的搭建及基本操作,感觉更适合初学者来学习,当然也希望大牛们能够给小白我提出 ...
- ThinkPHP框架学习(二)
在上一节中,我主要讲到了如何获取ThinkPHP框架,以及虚拟目录和虚拟主机的配置.准备工作完成之后,就可以利用ThinkPHP去部署项目了. 先在工作目录(D:/zend/workspace)下新建 ...
- ThinkPhp框架基础知识
ThinkPhp是一个采用MVC框架,免费开源.快捷简单的OOP轻量级PHP框架. MVC分三个部分: Model 模型层:模型层是应用程序的核心,可以是一个实体或一种业务逻辑,在应用程序中有更好的重 ...
- php 框架获取服务器,Thinkphp 框架基础之源码获取、环境要求与目录结构分析
本文实例讲述了Thinkphp 框架基础之源码获取.环境要求与目录结构.分享给大家供大家参考,具体如下: 获取ThinkPHP 获取ThinkPHP的方式很多,官方网站(http://thinkphp ...
最新文章
- Maven本地库在哪?
- MySQL与Redis一致性解决同步问题
- linux+sar+服务,sar服务监控Linux
- Win10 通过升级安装完成后出现了中文字体忽大忽小的问题解决。
- jzoj4235-序列【斐波那契数列】
- 数据结构-栈5-栈的应用-后缀转中缀
- ccie计算机网络英语,最新版CCIE Voice 语音方向 WOLF实验全套语音课程(含版本)...
- linux服务器文件名称乱码,linux中文文件名乱码怎么解决?
- (转)tomcat配置访问项目时不需要加项目名称
- 解决博易博客后台文章管理页面无法显示分页的问题
- 基于Keras搭建mnist数据集训练识别的Pipeline
- 请自行检查是否安装VC9运行库??
- 实时渲染学习(十一)渲染加速算法总结
- 【通讯录】Excel通讯录导入手机详细教程
- Web自动化漏洞检测工具:Xray
- mac 外接双显示器
- android 夏令时,android 时间处理(夏令时)
- 三菱fx2n64mr说明书_FX2N-64MR-001手册三菱FX2N-64MR-001使用说明书 - 广州凌控
- matlab中strvcat函数,matlab 函数手册大全(3)
- 【Android】虹软、安卓、Uniapp、SpringBoot 实现人脸识别
热门文章
- activeRecord 绑定属性的属性
- Python3 编程第一步
- Port already be taken
- 排序算法(插入、快速、归并)java实现
- Vmware安装提示在关闭以下进程 之前,无法进行安装的解决办法
- 进程、应用程序域、程序集、对象上下文区别与联系
- [Vue.js进阶]从源码角度剖析vue-router(三)
- 获取jar中的资源文件途径
- Java中 Character方法练习:字符串中英文字母个数 5435abc54abc3AHJ5 正则:matches([a-zA-Z0-9]{1})...
- 洛谷P2327 [SCOI2005] 扫雷