## 基类实战--析构函数的使用 什么是析构函数?估计会有很多人还没有用过 其实析构函数就是一个收尾的一个方法,我们实际用一个例子学一下.我们创建一个以下虚拟基类 ~~~ <?php namespace app\base\controller; use think\Cache; use think\Controller; use think\Session; use think\Loader; /** * Created by PhpStorm. * Power by Mikkle * QQ:776329498 * Date: 2017/4/12 * Time: 13:28 */ abstract class Base extends Controller { protected $error; //出错时候的记录 protected $log=[]; //要保存的记录 protected $saveLog = false ; /** * Power by Mikkle * QQ:776329498 * @param string $code * @param array $data * @param string $msg * @return array */ static public function showReturnCode($code = '', $data = [], $msg = '') { $return_data = [ 'code' => '500', 'msg' => '未定义消息', 'data' => $code == 1001 ? $data : [], ]; if (empty($code)) return $return_data; $return_data['code'] = $code; if(!empty($msg)){ $return_data['msg'] = $msg; }else if (isset(ReturnCode::$return_code[$code]) ) { $return_data['msg'] = ReturnCode::$return_code[$code]; } return $return_data; } protected function addLog($code='',$msg=''){ $this->log[] =[ 'uuid' => $this->uuid, 'url' => $this->request->url(true), 'method' => $this->request->method(), 'data' => $this->getData(), 'ip' => $this->request->ip(), 'code'=>$code, 'desc' => $msg, ]; } protected function toSaveLog(){ $this->saveLog = true ; $this->addLog(); } protected function showReturnCodeWithSaveLog($code = '', $data = [], $msg = ''){ $this->saveLog = true ; $this->addLog($code,$msg); return self::showReturnCode($code, $data, $msg); } protected function getData(){ if ($this->request->isPost()){ return $this->request->post(); }else{ return $this->request->get(); } } protected function saveLogAction(){ if (!empty($this->log)){ foreach($this->log as $value){ dump($value); } } } public function __destruct() { // TODO: Implement __destruct() method. //记录日志 if (!empty($this->log) && $this->saveLog == true){ $this->saveLogAction(); } } } ~~~ 然后我们建立一个新的控制器继承这个基类,好,我们这个文件就一行代码 ~~~ <?php /** * Created by PhpStorm. * Power by Mikkle * QQ:776329498 * Date: 2017/5/22 * Time: 14:30 */ namespace app\member\controller; use app\base\model\Member; use think\Cache; use think\Db; class Test extends Base { public function index(){ return $this->showReturnCodeWithSaveLog(1001,'演示析构函数成功了'); } } ~~~ 好现在我们运行一下这个新建的Text控制器的index方法 运行结果如下 ![](https://box.kancloud.cn/a348d274b9201743525dbd79992ba27b_499x218.png) > 不知道大家能看懂多少 先慢慢看吧. > 换句现在流行的一句话,码农现在也是拼爹时代,老子搞好了,儿子就容易了 那现在我来解析一下整个运行过程 实现 我们运行 一个返回方法 ~~~ $this->showReturnCodeWithSaveLog(1001,'演示析构函数成功了'); ~~~ 这个返回方法更改了类的保存状态,并调用的添加日志的方法 ~~~ protected function showReturnCodeWithSaveLog($code = '', $data = [], $msg = ''){ $this->saveLog = true ; $this->addLog($code,$msg); return self::showReturnCode($code, $data, $msg); } ~~~ 接着,整个方法运行最后将运行析构函数 ~~~ public function __destruct() { // TODO: Implement __destruct() method. //记录日志 if (!empty($this->log) && $this->saveLog == true){ $this->saveLogAction(); } } ~~~ 在析构函数中,我们判断了类的属性是否要保存log记录,并运行自定义的保存方法. >[info] 我这里只是拿出一个实例来讲解析构函数的使用方法,会用是一回事,用活又是另一回事,后期课程如果有时间,我再讲讲析构函数和Hook等类的结合应用,来打造出来的另一番海阔天空... >[danger] 写在最后的话,我这个例子只是利用析构函数记录复杂的操作日志,更多的是作为演示使用. 切记 不能用它代替系统日志,一旦中途报错 ,析构函数的方法就无法运行了.切记切记...