class App {

    public static function init() {
load_ext_file(COMMON_PATH);
// {
// /home/www/www.domain.com/myapp/Common/Common/<LOAD_EXT_FILE,field1>.php
// /home/www/www.domain.com/myapp/Common/Conf/<LOAD_EXT_CONFIG,config1>.php
// } // URL调度
Dispatcher::dispatch();
// {
// //...
// // 匹配出模块
// //...
// // 加载模块配置文件 /home/www/www.domain.com/myapp/Module1/Conf/config.php
// if(is_file(MODULE_PATH.'Conf/config'.CONF_EXT))
// C(load_config(MODULE_PATH.'Conf/config'.CONF_EXT));
// // 加载应用模式对应的配置文件
// if('common' != APP_MODE && is_file(MODULE_PATH.'Conf/config_'.APP_MODE.CONF_EXT))
// C(load_config(MODULE_PATH.'Conf/config_'.APP_MODE.CONF_EXT));
// // 当前应用状态对应的配置文件
// if(APP_STATUS && is_file(MODULE_PATH.'Conf/'.APP_STATUS.CONF_EXT))
// C(load_config(MODULE_PATH.'Conf/'.APP_STATUS.CONF_EXT)); // // 加载模块别名定义 /home/www/www.domain.com/myapp/Module1/Conf/alias.php
// if(is_file(MODULE_PATH.'Conf/alias.php'))
// Think::addMap(include MODULE_PATH.'Conf/alias.php');
// // 加载模块tags文件定义 /home/www/www.domain.com/myapp/Module1/Conf/tags.php
// if(is_file(MODULE_PATH.'Conf/tags.php'))
// Hook::import(include MODULE_PATH.'Conf/tags.php');
// // 加载模块函数文件 /home/www/www.domain.com/myapp/Module1/Conf/function.php
// if(is_file(MODULE_PATH.'Common/function.php'))
// include MODULE_PATH.'Common/function.php'; // // 加载模块的扩展配置文件
// load_ext_file(MODULE_PATH);
// // {
// // /home/www/www.domain.com/myapp/Module1/Common/Common/<LOAD_EXT_FILE,field1>.php
// // /home/www/www.domain.com/myapp/Module1/Common/Conf/<LOAD_EXT_CONFIG,config1>.php
// // } // // 获取控制器的命名空间(路径)
// // controller // // 获取控制器和操作名
// // action
// } Hook::listen('url_dispatch');
} public static function run() {
// 应用初始化标签
Hook::listen('app_init'); // 执行执行app_init标记的行为,没有返回值
// {
// Behavior\BuildLiteBehavior
// } App::init(); // ******* 引入其他文件,解析路由,引入模块中的相关配置 ******* Hook::listen('app_begin');
// {
// Behavior\ReadHtmlCacheBehavior
// } // Session初始化
if(!IS_CLI){
session(C('SESSION_OPTIONS'));
} App::exec(); // ******* 根据解析出来的路由,执行代码 ******* Hook::listen('app_end');
// {
// Behavior\ShowPageTraceBehavior
// }
} public static function exec() { if(!preg_match('/^[A-Za-z](\/|\w)*$/',CONTROLLER_NAME)){ // 安全检测
$module = false;
}elseif(C('ACTION_BIND_CLASS')){
// 操作绑定到类:模块\Controller\控制器\操作
$layer = C('DEFAULT_C_LAYER');
if(is_dir(MODULE_PATH.$layer.'/'.CONTROLLER_NAME)){ // /home/www/www.domain.com/myapp/Module1/Controller/Ctrl1
$namespace = MODULE_NAME.'\\'.$layer.'\\'.CONTROLLER_NAME.'\\'; // \Module1\Controller\Ctrl1\
}else{
// 空控制器
$namespace = MODULE_NAME.'\\'.$layer.'\\_empty\\'; // \Module1\Controller\_empty\
}
$actionName = strtolower(ACTION_NAME);
if(class_exists($namespace.$actionName)){ // \Module1\Controller\Ctrl1\action1
$class = $namespace.$actionName;
}elseif(class_exists($namespace.'_empty')){ // \Module1\Controller\Ctrl1\_empty
// 空操作
$class = $namespace.'_empty';
}else{
E(L('_ERROR_ACTION_').':'.ACTION_NAME);
}
$module = new $class;
// 操作绑定到类后 固定执行run入口
$action = 'run';
}else{
//创建控制器实例
$module = controller(CONTROLLER_NAME,CONTROLLER_PATH);
// {
// new \Module1\Controller\Ctrl1
// new \Addon\$_GET['addon']\Controller\Ctrl1
// }
} if(!$module) {
if('4e5e5d7364f443e28fbf0d3ae744a59a' == CONTROLLER_NAME) {
header("Content-type:image/png");
exit(base64_decode(App::logo()));
} // 是否定义Empty控制器
$module = A('Empty'); // EmptyController
if(!$module){
E(L('_CONTROLLER_NOT_EXIST_').':'.CONTROLLER_NAME);
}
} // 获取当前操作名 支持动态路由
if(!isset($action)){
$action = ACTION_NAME.C('ACTION_SUFFIX');
}
try{
self::invokeAction($module,$action); // 执行行为方法
} catch (\ReflectionException $e) {
// 方法调用发生异常后 引导到__call方法处理
$method = new \ReflectionMethod($module,'__call');
$method->invokeArgs($module,array($action,''));
// {
// EmptyController::__call()
// Ctrl1Controller::__call()
// }
}
return ;
}
}

thinkphp 3.2.3 - App.class.php 解析的更多相关文章

  1. thinkphp 3.2.3 - Think.class.php 解析

    class Think { public static function start() { // 注册AUTOLOAD方法 spl_autoload_register('Think\Think::a ...

  2. 三、Angular项目,app.module.ts解析

    1. 项目主要文件存放的路径 2.app.module.ts模块解析 3.模块和组件关系 |--app.module.ts(模块) |--app.component.ts(组件)  |--app.co ...

  3. Android学习系列(20)--App数据格式之解析Json

    JSON数据格式,在Android中被广泛运用于客户端和网络(或者说服务器)通信,非常有必要系统的了解学习.     恰逢本人最近对json做了一个简单的学习,特此总结一下,以飨各位.     为了文 ...

  4. express中app.get和app.use的解析

    app.get(path,callback)中的callback只能是函数 app.use(path,callback)中的callback既可以是router对象又可以是函数 当其是router对象 ...

  5. 国内四大炒股软件APP 全面技术解析

    随着人们的焦点逐步由电脑PC端转为手机端之后,国内炒股软件也逐步开始推出手机炒股APP,但是面对如此众多的都以“最牛.最佳”等冠名的APP真的实至名归吗?为了大家不再走弯路,不沉迷智能选股,笔者将近期 ...

  6. iOS 直播类APP开发流程解析

    1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示1.数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据涉及技术或协议:摄像机:CCD.C ...

  7. thinkphp 3.2.3 - Route.class.php 解析(路由匹配)

    class Route { public static function check(){ $depr = C('URL_PATHINFO_DEPR'); // '/' $regx = preg_re ...

  8. thinkphp 3.2.3 - Dispatcher.class.php 解析(转发器)

    class Dispatcher { public static function dispatch() { $varPath = C('VAR_PATHINFO'); // 's' $varAddo ...

  9. 微智魔盒APP开发程序解析

    微智魔盒系统开发找崔经理l88Z.6ZZ685l.微智魔盒app开发.微智魔盒商城开发.微智魔盒软件开发,微智魔盒模式开发,微智魔盒源码开发.微智魔盒开发. @Override publicvoidr ...

随机推荐

  1. 008 String to Integer (atoi) 字符串转换为整数

    详见:https://leetcode.com/problems/string-to-integer-atoi/description/ 实现语言:Java class Solution { publ ...

  2. Java集合——集合框架Set接口

    1.Set接口 一个不包含重复元素的collecyion.更确切的讲,set不包含满足e1.equals(e2)的元素e1和e2,并且最多包含一个null元素. 2.HashSet 类实现Set接口, ...

  3. Java面向对象_对象内存分析—值传递和引用传递

    对象内存分析,我一直学的比较模糊,今天抽空整理一下,希望能理清. 先说一下,内存分析从何而来,这对于我们这些刚接触java的人来说都比较模糊,就从new关键字说起吧. new关键字表示创建一个对象或者 ...

  4. Kotlin容器

    1. 容器 可变/不可变 List<out T> 只读list; MutableList<T>; Set<out T>/MutableSet<T> Ma ...

  5. CSS中的IFC和BFC入门

    CSS中的IFC和BFC入门   提到CSS,首先会想到的就是盒模型,如果对于盒模型不是很理解的,看这里.这是一个基础的系列,看了盒模型还可以看看box-sizing,好了不多说了,下面介绍今天的重点 ...

  6. asp.net MVC 中枚举创建下拉列表?

    我将尝试使用 Html.DropDownList 扩展方法,但不能找出如何使用它的枚举. 让我们说我有一个这样的枚举: public enum ItemTypes { Movie = 1, Game ...

  7. WPF自定义分页控件,样式自定义,简单易用

    WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...

  8. Spring Cloud 服务发现和消费

    服务的发现和消费 有了服务中心和服务提供者,下面我们来实现一个服务的消费者: 服务消费者主要完成两个任务——服务的发现和服务的消费,服务发现的任务是由Eureka客户端完成,而服务消费的任务是由Rib ...

  9. swift学习笔记7

    不管做什么事,只要敬业点,把该作的做好.不要总找借口. 不要看不起小事,生活本是一件件小事的集合.细节决定成败. 士兵突击里面有句台词:他每做一件小事的时候,都好像抓住了一根救命稻草,到最后你才发现, ...

  10. Don't let anyone tell you different.

    Don't let anyone tell you different.不要让任何人否定你的与众不同.