手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2012年01月的文章

PHP调用不存在的类时自动创建相应类

在项目中,难免会在项目中调用一个不存在的类(偶尔,偶尔,当这个类的类名是程序生成的时候,偶尔会出现这种情况啦),在new 这个类时,都会直接报fatal错误,然后程序就终止了,怎么办?怎么避免这种情况发生?

注:下面的例子其实是指有autoload的情况下所触发的。如果没有autoload,也就相当于不会触发一个include文件的操作。直接就报FATAL错误了。而如果有autoload,则是报include文件的错误,这个时候才能被捕获,多谢神仙的指正

于是看手册set_error_handler,调用一个callback,处理完后,在这个方法里重新生成一个空类就OK了。看了一下手册上的例子

PHP代码
  1. <?php  
  2. // error handler function  
  3. function myErrorHandler($errno$errstr$errfile$errline)  
  4. {  
  5.     if (!(error_reporting() & $errno)) {  
  6.         // This error code is not included in error_reporting  
  7.         return;  
  8.     }  
  9.   
  10.     switch ($errno) {  
  11.     case E_USER_ERROR:  
  12.         echo "<b>My ERROR</b> [$errno] $errstr<br />\n";  
  13.         echo "  Fatal error on line $errline in file $errfile";  
  14.         echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";  
  15.         echo "Aborting...<br />\n";  
  16.         exit(1);  
  17.         break;  
  18.   
  19.     case E_USER_WARNING:  
  20.         echo "<b>My WARNING</b> [$errno] $errstr<br />\n";  
  21.         break;  
  22.   
  23.     case E_USER_NOTICE:  
  24.         echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";  
  25.         break;  
  26.   
  27.     default:  
  28.         echo "Unknown error type: [$errno] $errstr<br />\n";  
  29.         break;  
  30.     }  
  31.   
  32.     /* Don't execute PHP internal error handler */  
  33.     return true;  
  34. }  

看了一下,结果,发现只有$errstr中才有类名出现,但还是文件名,难道我要用正则?又仔细看了一下手册,发现callback还有一个第五个参数

XML/HTML代码
  1. errcontext  
  2.     The fifth parameter is optional, errcontext, which is an array that points to the active symbol table at the point the error occurred. In other words, errcontext will contain an array of every variable that existed in the scope the error was triggered in. User error handler must not modify error context.   

 

输入第五个参数,原来,这是一个数组,如果我是类的话,里面就有className这个下标数组,直接就是类名了

同时还有一个很重要的问题,如果callback return false的话,会自动调用原来的出错处理。这  其实是影响我们的操作的。

最终代码如下:

PHP代码
  1. set_error_handler(function($errno,$errstr,$errfile,$errline,$clsname){  
  2.     if(isset($clsname['className'])&&$errno == 2&&!class_exists($clsname['className'])){  
  3.         $clsname = $clsname['className'];  
  4.         eval("class ".$clsname ." { static public function model(){return null;} }");  
  5.     }  
  6.     return true;  
  7. },7);  
  8. $result = mmmm::model();  
  9. restore_error_handler();  
  10.  

在最后一行恢复了原来的出错处理,不影响原先程序结构。

 

终于可以直接用了。

 

Tags: php, eval

ubuntu下最简单的更改时区

   一般情况下,我们刚装好的ubuntu时区都是US(默认语言为英文时),而且,它本身就是使用UTC格式作为标准时间格式,如果在Linux下运行程序,且在程序中指定了与系统不一样的时区的时候,可能会造成时间错误。 如果是Ubuntu的桌面版,可以直接在图形模式下修改时区信息,如果是Server版呢,则需要通过tzconfig来修改时区信息了。只是这样的方式会相对比较麻烦,
     使用方式 (如将时区设置成Asia/Chongqing):
sudo tzconfig
然后按照提示选择 Asia对应的序号,选完后会显示一堆新的提示—输入城市名,如Shanghai或Chongqing,最后再用 sudo date -s “” 来修改本地时间。

但事实上,并不需要这么复杂的处理,一个偷懒的方法就是,直接:cp /usr/share/zoneinfo/Asia/ShangHai /etc/localtime,用shanghai的时区文件覆盖localtime。灰常方便,这时候看一下date,时间是不是正确了?

Tags: ubuntu, 时区

元旦记事

元旦其实过的很快,不上班比上班还累,这是有小孩的人都会这么想的吧?
元旦期间,手被烫伤
小孩很听话,只是偶尔问他,爸爸对你凶不凶,在想了一会之后都是很坦然的说:很凶
最近一直在尝试改变,对小孩不要那么凶,确实没有什么太大的意义。何必呢?毕竟大我时候,都是丈母娘他们在带着孩子。
元旦带小孩去买了点衣服,想着过年回家的时候可能会穿。
元旦还处理了一些旧书,40多斤的书,只折成了20多块钱,原价大约600多吧。想想也确实可惜,买不如借,借不如租,租不如偷,袁枚当初就是这样说的吧?他当然不会说租不如偷。所幸卖掉的这些书,我都看完了。否则心更痛。
整理书的时候发现原来我有那么多书没有看完过。大于等于10本书没有看全,只看了几章的也有。这时候就在迷惘我是该慢慢看完,还是确实就扔在那里?想看的时候再看?
带着孩子还去了游乐场,小孩子其实没玩多少,反而都是我和我老婆在玩。好象有点不太厚道。。。。

新的一年初始,还算是不错,唯一就是半夜小孩起来尿尿的时候,尿了一床,嗯,没对准塑料面盆,有点纠结。总体还是不错。

Tags: 2012

元旦快乐

如果真象所有的电视、电影里说的。那么还只剩300多天了。所以,各位,可以开始倒记时了,但没关系,至少今天还是快乐的。
元旦快乐。
感谢去年、前年以及以前有帮助过我的朋友们、师长们、长辈们。感谢你们。(如果真有2012,还是先早点说吧,省得以后没机会说出口)

Tags: 元旦

Records:29123456