非常处理用于处理程序中的非常状况,虽说是“非常状态”,但仍旧还是在程序编写职员的预见之中,实在程序的非常处理完备可以用‘if else’语句来代替,但非常处理自然有其上风之处。
个人总结其优点如下:
虽然将代码放在try catch块中会有微微的效率差,但是跟这些优点一比,这点花费就不算什么了。那么PHP的非常处理怎么利用呢?

PHP内置有Exception类,使得我们可以通过实例化非常类来抛出非常。我们将代码放在try语句中实行,并在其后用catch试图捕捉到在try代码块中抛出的非常,并对非常进行处理。我们还可以在catch代码段后利用finally语句块,无论是否有非常都会实行finally代码块的代码,try catch语句形如下面代码:
try{\r throw new Exeption('msg'[,'code',$previous_exeception]);\r}catch(Exeption $var) {\r process($var);\r}catch(MyException $e){\r process($e)\r}finally{\r dosomething;\r}
利用try catch语句,须要把稳:
当我们抛出非常时,会实例化一个非常类,此非常类可以自己定义,但在catch语句中,我们须要规定要捕获的非常工具的类名,并且只能捕获到特定类的非常工具,当然我们可以在末了捕获一个非常基类(PHP内置非常类)来确保非常一定能被捕获。在抛出非常时,程序会被终止,并回溯代码找到第一个能捕获到它的catch语句,try catch语句是可以嵌套的,并且如上面代码所示 cacth语句是可以多次定义的。finally块会在try catch块结束后实行,纵然在try catch块中利用return返回,程序没有实行到末了。框架里的非常处理说了那么多非常干系(当然阐明这些也是为了能理解和利用框架),那么框架里要怎么实现呢?
重写非常类
我们可以重写非常类,完善其内部方法:
<?php \rclass Exception \r{ \r protected $message = 'Unknown exception'; // 非常信息 \r protected $code = 0; // 非常代码 \r protected $file; // 发生非常的文件名 \r protected $line; // 发生非常的代码行号 \r\r function __construct($message = null, $code = null,$previous_exeception = null); \r\r final function getMessage; // 返回非常信息 \r final function getCode; // 返回非常代码 \r final function getFile; // 返回发生非常的文件名 \r final function getLine; // 返回发生非常的代码行号 \r final function getTrace; // 返回非常trace数组 \r final function getTraceAsString; // 返回非常trace信息\r\r /\r 记录缺点日志\r /\r protected function log{\r Logger::debug;\r }\r}
如上,final方法是不可以重写的,除此之外,我们可以定义自己的方法,如记录非常日志,像我自定义的log方法,在catch代码块中,就可以直策应用$e->log
来记录一个非常日志了。
注册全局非常方法
我们可以利用set_exception_handler('exceptionHandler')来全局捕获没有被catch块捕获到的非常,此非常处理函数须要传入一个非常处理工具,这样可以剖析此非常处理信息,避免系统涌现不人性化的提示,增强框架的健壮性。
function exceptionHandler($e) {\r echo '有未被捕获的非常,在' . $e->getFile . \"大众的\"大众 . $e->getLine . \"大众行!\公众;\r}
顺便再说一下其他的全局处理函数:
set_shutdown_function('shutDownHandler')来实行脚本结束时的函数,此函数纵然是在ERROR结束后,也会自动调用。set_error_handler('errorHandler')在PHP发生缺点时自动调用,把稳,必须在已注册缺点函数后才发出的缺点才会调用。函数参数形式应为($errno, $errstr, $errfile, $errline);但是要把稳这些全局函数须要在代码段的前面已经定义过再注册。
数据表和Model类的ActiveRecord映射
初次利用yii2的ActivceRecord类以为好方便,只须要定义其字段同名属性再调用save方法就OK了(好神奇啊),它是怎么实现的呢,看了下源码,明白了其大致实现过程(基类)。
利用‘describe table_name’ 查询语句;剖析查询结果:对每一个字段,有Field(字段名)、Type(数据类型)、Null(是否为空)、Key(索引信息,‘PRI’表示为主键)、Default(默认值)、Extra(附加信息,如auto_increment)通过判断其主键($row['KEY'] == 'PRI'
)信息,保存时看是否有主键信息,若存在,则为更新;不存在,则插入。其余,解析出来的字段信息还有更多妙用~~结语觉得好久没写博客了,‘毕业’对付一个类似专科学习办法的人来说是有些繁琐了,保存好对学校的留恋,连续出发。
真是越学习越以为自己认识不足,在看一些PHP框架源码时,有时候会觉得自己还差得很远,那种整体感和布局感,估计须要韶光和履历的积累吧。
由于框架的运用和自己现在的事情关系不是特殊大,而且自己最近在努力学习一些编程底层类的东西,以是框架系列可能会有些‘便秘’,会写点其他的。。。这两天准备换地方住了,跑着看屋子了,体谅我‘短’一点。。
哈哈,欢迎连续关注我的博客,嗯,一贯在存心。