怎么一步步编写简单的PHP的Framework(八)

      昨天我写到咱们使用前端控制器来控制全部请求,今天咱们继续这个话题。 php

       既然前端控制器控制一切,那么咱们能够用它来作更多的事情!! 前端

       咱们知道,在windows里面默认php.ini中display_errors默认开启,而在linux中默认是关闭的,那么这样对于程序的调试时很麻烦的,因此咱们能够在配置文件中设置一个debug属性,它表明是否调试打开,若是打开调试,程序出现任何异常,那么会输出不少调试信息。在这儿,我只是很简单的设置一下,真正的框架调试功能确定不是这样简单的。 linux

       先咱们实现若是debug开启,那么显示调试信息debug mode:这样一个字符串,而且若是程序有语法或其余错误,显示错误信息,若是调试关闭,那么任何错误信息都不显示。 windows

       如今修改FrontController的__construct函数: session


private function __construct() {
		C(Config::factory(Config::PHP)); //写入配置信息
		session_start();
		if(true === C('debug')) {
			echo 'debug mode:';
			ini_set('display_errors','On');
			error_reporting(C('errorReporting'));
		} else {
			error_reporting(0);
			ini_set('display_errors','Off');
		}
	}
         在这个函数中,主要就新增了调试功能而且默认打开了session,因为PHP中关于错误的配置主要有error_reporting函数和php.ini中的display_errors这一项,因此只须要设置这两项,无论操做系统是什么样的,均可以好好的控制住调试信息了。


         写过PHP程序的人可能都会知道,PHP默认的时区不是中国的,因此若是你使用date函数取出当前时间戳的时候,会发现不对,因此须要明确指定时区,其实这个工做就能够彻底由框架完成,只要在配置文件中写入时区的值,而后框架调用date_default_timezone_set这个函数设置时区便可。 框架

         这样的话,FrontController的__construct这个函数就变成了下面这样了: 函数

 

private function __construct() {
		C(Config::factory(Config::PHP)); //写入配置信息
		session_start();
		date_default_timezone_set(C('timeZone'));
		if(true === C('debug')) {
			echo 'debug mode:';
			ini_set('display_errors','On');
			error_reporting(C('errorReporting'));
		} else {
			error_reporting(0);
			ini_set('display_errors','Off');
		}
	}


          若是你们看过Toper的源码的FrontController.class.php这个文件的话,就会注意到这个文件代码也仍是挺多的,并不像我如今这儿写的这样,只有二十多行,这其实是由于一个Framework的FrontController还须要作不少其余的事情,好比防止CSRF攻击,支持自定义配置项等,而这些因为篇幅缘由我写不了。 操作系统

          设置debug模式在真实的Framework也不是只输出debug mode:这样一个字符串而已,这点你们必需要清楚。 debug

           学过Java的人都知道在Java中全部对象都有一个基类Object,在框架中是否也可使用一个基类呢? 调试

           这个基类作一些什么功能呢,好比当调用了一个类的不存在 的方法,那么它会调用__call这个魔术方法,若是咱们在基类中覆盖这个方法,那么其余全部类继承这个类,调用这些类的方法的时候,若是不存在,天然也就转到了这个方法,在这个方法中能够作一些补救措施,这样总比直接输入方法不存在要好一些。

            咱们暂时就把这个基类称为Base,在Toper中,这个基类叫Tp。

             先贴出Base.php的源码:


<?php
class Base {
	public function __call($name,$arguments) {
		if(true === C('debug')) {
			echo 'not exists method:';
			echo 'the name is :';
			var_dump($name);
			echo 'the arguments is :';
			var_dump($arguments);
		}
		throw new Exception('not exists method');
	}
}
           暂时功能写简单一点,若是调试打开,那么就把不存在的方法名和参数输出来,这样对于开发者更容易找到错误发生的位置,固然,无论调试是否打开,Exception确定是要抛出的。固然,在线上的时候,若是出现这种问题,能直接把异常信息展示在页面上吗,不能,最好是能将异常信息输出到日志文件,而后页面跳转到错误页,那这样最好咱们自定义一套异常处理的类,这些类继承自Exception,而后断定是否debug开启,若是开启debug,那么直接输出信息,不然,将异常信息输出到日志文件,而后跳转到错误页,具体怎么作,你能够本身试一试!!!


           不知道你们注意到没有,全部我写的php文件我都没有写php的结束符?>,这是为何呢?

           实际上很简单,我举一个例子:

            如今有a.php和b.php,a.php的源码是这样:


<?php
//这个地方貌似没有输出哦
?>
 
             而后b.php的源码是这样: 



<?php
include a.php
session_start();
?>
             若是你们运行一下,会发现它会抛出警告说header already send out ,为何呢?


             主要是a.php在PHP结束符调用以后还有几行空白,那么PHP会认为它是HTML代码,这样是否是在调用session_start以前,就已经有header输出了嘛,咱们知道,调用session_start以前,是不能有任何输出的,因此程序就会抛出警告。

              若是使用?>,那么咱们可能会在不经意间犯这个错误,当项目大,代码量大以后,要找到这样一个问题是很难的,这样给代码的维护带来很严重的问题,因此,最好在PHP文件最后不要写?>,这也是zend官方推荐的作法。

              今天的代码点此下载

相关文章
相关标签/搜索