从零开始写自己的PHP框架系列教程(二)[App.php]
从这一个文件开始以后加载的均以类加载,请注意命名空间和所在文件的路径
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]的更多相关文章
- 从零开始写自己的PHP框架系列教程[前言]
我觉得程序员进步的理由:多看->多写->多总结 我自我介绍下,我不是程序员,但是我爱编程,作为业余程序员自己写框架让人感到兴奋的,目前有很多框架(js有jQuery.Express.soc ...
- 从零开始写自己的PHP框架系列教程(一)[core.php]
这里我直接上代码: /** * 框架核心 */ if (version_compare(PHP_VERSION, '5.3.0','<')) { header("Content-Typ ...
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
- WPF系列教程——(二)使用Prism实现MVVM设计模式 - 简书
原文:WPF系列教程--(二)使用Prism实现MVVM设计模式 - 简书 本文假设你已经知道MVVM设计模式是什么,所以直接进入正题,今天我们就用Prism来实现WPF的MVVM设计模式,百度上关于 ...
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- C#微信公众号开发系列教程二(新手接入指南)
http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...
- webpack4 系列教程(二): 编译 ES6
今天介绍webpack怎么编译ES6的各种函数和语法.敲黑板:这是webpack4版本哦, 有一些不同于webpack3的地方. >>> 本节课源码 >>> 所有课 ...
- Shell脚本系列教程二: 开始Shell编程
Shell脚本系列教程二: 开始Shell编程 2.1 如何写shell script? (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器; (2) ...
随机推荐
- 手机上 input submit ios和andirod样式不统一
-webkit-appearance:none;
- word中一页中添加两种不同的页码
,在文档编写的过程中,可能一个页面需要编写两个不同的页码,举个例子,在页脚有一个页码是整个文档的页码,页眉有一个页码,是每个章节的页码: 设置如下: 此处选中这个图标是为了能够看到分节符和其他的符号 ...
- FPM四:用OVP做查询跳转到明细
前面做了查询的UIBB配置,在这边可以直接复用,查询的feeder class也就自动复用了. 1.给查询的feeder class添加接口,继续继承form的接口. 2.挨个实现每个方法,即使是用不 ...
- Emacs中的代码折叠控制
之前在别的编辑器里用到代码折叠的功能很好用. 对 Emacs 不够熟悉,作为一只坚强的懒癌晚期患者,一直没开启这个功能,使用石器时代的标记法来记录每个结构的起止位置,效率可想而知. 今天可算是找着它啦 ...
- javascript 模板
今天想记录下对arttemplate模板的使用,哎,其实这玩意的兴起主要还是得从浏览器操作dom说起.如果修改浏览器的某一个dom节点就会引起文档流的重绘,然后这个重绘的耗时相当的大,是昂贵的开销.所 ...
- 学习python D1
shell脚本最擅长移动文件和替换文本,并不适合GUI界面或者游戏开发,Python是一种解释型语言,在程序开发阶段可以为你节省大量时间 Python2的用户输入需要用raw_input()而非inp ...
- git常用命令学习笔记
安装好git之后即可使用git来管理项目了,鼠标右键点击 git bash出现命令黑窗口,接下来执行git指令即可. https://git-scm.com/book/zh/v2 以下整理了git常用 ...
- windwos安装docker步骤
参考 https://www.linuxidc.com/Linux/2016-07/133506.htm
- shell脚本中给字符串添加颜色
shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e 格式如下: echo -e "\033[字背景颜色:文字颜色m字符串\033[0m" 例如: ec ...
- namespace的作用
namespace的用法 1.什么是命名空间 通常我们学c++的时候经常看见头文件下有一句using namespace std,有什么用呢? 例如: #include<iostream> ...