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

yii CActiveRecord 中的一点小注意事项

纯笔记,在使用ActiveRecord的时候一点注意事项。
本来在处理缓存的时候想对一些数据做强制缓存的,但结果预想的目标和我不一样。
我的$cachekey = md5(serialize($model).$parameter);
然后在调用的时候发现$model对象中的一些信息都消失了。起初以为参数没有传递,但测试了一下之后发现全部正常,那问题出在哪里呢?
再一步步的调试,发现出在serialize后对象就变了。于是看了一下CActiveRecord的源码,果然发现了源码中有定义__sleep(),纠结啊。
看来以后要注意一下,不能随便把model给序列化了。

Tags: cactiverecord, __sleep, serialize

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