从这一个文件开始以后加载的均以类加载,请注意命名空间和所在文件的路径

APP.php的这个类所在路径:根目录\framework\App.php

直接上代码

namespace framework;

class App {

    /**
* 初始化配置
* @Author yiwanxifan
*/
static protected function init() {
Config::init( ROOT_PATH );
Config::loadConfig( CONFIG_PATH . 'global.php' );
Config::loadConfig( CONFIG_PATH . Config::get('ENV') . '.php' );
date_default_timezone_set( Config::get('TIMEZONE') ); //error display
if ( Config::get('DEBUG') ) {
ini_set("display_errors", 1);
error_reporting( E_ALL ^ E_NOTICE );
} else {
ini_set("display_errors", 0);
error_reporting(0);
} include_once ROOT_PATH.'data/version.php'; } /**
* 运行框架
* @Author yiwanxifan
*/
static public function run() {
try{
self::init();
Hook::init(ROOT_PATH);
Hook::listen('appBegin'); Hook::listen('routeParseUrl', array( Config::get('REWRITE_RULE'), Config::get('REWRITE_ON'))); //默认路由设置
if( !defined('APP_NAME') || !defined('CONTROLLER_NAME') || !defined('ACTION_NAME')){
Route::parseUrl( Config::get('REWRITE_RULE'), Config::get('REWRITE_ON') );
}
$controller = '\app\\'. APP_NAME .'\\'. CONTROLLER_NAME;$action = ACTION_NAME; if( !class_exists($controller) ) {
throw new \Exception("Controller '{$controller}' not found", 404);
}
$obj = new $controller();
if( !method_exists($obj, $action) ){
throw new \Exception("Action '{$controller}::{$action}()' not found", 404);
} Hook::listen('actionBefore', array($obj, $action));
$obj ->$action();
Hook::listen('actionAfter', array($obj, $action)); } catch(\Exception $e){
Hook::listen('appError', array($e));
} Hook::listen('appEnd');
} }

代码里面的Config.php和Hook.php跟App.php 在同一个目录

Config.php为配置文件

Hook.php为钩子文件(什么叫钩子文件,说白了就是在程序的运行当中调用其他钩子的一个类)

从零开始写自己的PHP框架系列教程(二)[App.php]的更多相关文章

  1. 从零开始写自己的PHP框架系列教程[前言]

    我觉得程序员进步的理由:多看->多写->多总结 我自我介绍下,我不是程序员,但是我爱编程,作为业余程序员自己写框架让人感到兴奋的,目前有很多框架(js有jQuery.Express.soc ...

  2. 从零开始写自己的PHP框架系列教程(一)[core.php]

    这里我直接上代码: /** * 框架核心 */ if (version_compare(PHP_VERSION, '5.3.0','<')) { header("Content-Typ ...

  3. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

  4. WPF系列教程——(二)使用Prism实现MVVM设计模式 - 简书

    原文:WPF系列教程--(二)使用Prism实现MVVM设计模式 - 简书 本文假设你已经知道MVVM设计模式是什么,所以直接进入正题,今天我们就用Prism来实现WPF的MVVM设计模式,百度上关于 ...

  5. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  6. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  7. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...

  8. webpack4 系列教程(二): 编译 ES6

    今天介绍webpack怎么编译ES6的各种函数和语法.敲黑板:这是webpack4版本哦, 有一些不同于webpack3的地方. >>> 本节课源码 >>> 所有课 ...

  9. Shell脚本系列教程二: 开始Shell编程

    Shell脚本系列教程二: 开始Shell编程 2.1 如何写shell script? (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器; (2) ...

随机推荐

  1. Bootstrap 4 网格的基本结构

    Bootstrap 4 网格的基本结构 网格类 Bootstrap 4 网格系统有以下 5 个类: .col- 针对所有设备 .col-sm- 平板 - 屏幕宽度等于或大于 576px .col-md ...

  2. 使用Visual Studio Installer 2015打包WPF程序

    前言 做过WPF项目,就少不了要将程序打包部署到客户现场,因为一般长时间不会更新打包程序,每次变动较大需要重新配置打包程序时,就会有些生疏,不那么得心应手.为了方便记忆,记录到博客中. 准备 因为做过 ...

  3. 国外服务器:org.xml.sax.SAXParseException

    改为: xsi:schemaLocation="http://www.springframework.org/schema/beans classpath:org/springframewo ...

  4. scatter参数

    列出scatter常用的一些参数: plt.scatter(x,y,c= '颜色可选',marker= '点的样式', cmap= '颜色变化',alpha=“透明度”, linewidths=“线宽 ...

  5. js将手机号中间四位变成*号

    方法一.利用数组splice,split,join方法 var tel = 18810399133; tel = "" + tel; var ary = tel.split(&qu ...

  6. 关于:无法创建链接服务器 "ORCL" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的实例 (错误:7302)

    本人接触和使用Oracle数据库才有一个季度的时间,问题比较白,大神请无视本文. 环境: 1.数据服务器,windows2008R2,Oracle11g 2.报表服务器,windows2008R2,S ...

  7. cordova/phonegap/webapp性能优化方法

    1.有条件可以自己做UI,不要用框架.用框架的话不要用jquery mobile,用sencha touch或者jqmobi(app framework) 2.不要在服务器生成UI,在本地生成. 3. ...

  8. validation-api各注解的用法

    入参用@Valid,要不下面实体类中的注解不生效 @AssertFalse 被注解的元素必须为false@AssertTrue 被注解的元素必须为True@DecimalMax(value) 被注解的 ...

  9. left join on 后and 和 where 的区别

    SELECT * FROM student a LEFT JOIN sc b ON a.Sid = b.Sid AND a.Sname="赵雷" 结果:(left join 左连接 ...

  10. Tasklist使用详解

    用jstat查看jvm内存的使用的情况时,因为是windows机器,不能使用top命令方便的查出来,进程好在网上搜了一下看到了在windows原来使用的是tasklist 特意将tasklist的用法 ...