入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

ThinkPHP中_after_update、_before_update等的用法

创建时间:2015-12-17 投稿人: 浏览次数:5416

TP系统ThinkModel类里隐藏了几个有用的方法:

_before_insert、_after_insert、_before_delete 、_after_delete、_before_update、_after_update、_after_select。。。。。。

但是在手册里并没有列出来,只有在源码中才能看到。新建个测试类ArticleModel.class.php

class ArticleModel extends Model {

    protected $article = "";

    public function _initialize(){
        $this->article = M("Article");
    }

    public function updateArt($id = 0, $data = array()){
         $this->article->where("id = " . $id)->save($data);
    }

    protected function _before_update(&$data,$options) {
        $data["contents"] = "ppppppp";
    }

    protected function _after_update($data,$options) {
        $this->article->add($data);
    }
}
在控制器里调用

public function update() {
        $id = 1;
        $data["title"] = "ttt";
        D("Article")->updateArt($id,$data);
    }
结果发现,_before_update和_after_update都没触发,但在系统的ThinkModel类里却能触发,手册中关于M方法和D方法,发现这句:M方法实例化的时候,默认情况下是直接实例化系统的ThinkModel类。而我平时在写自定义模型层时,习惯在模型层里先M一下自己,找到问题,修改自定义模型层:

class ArticleModel extends Model {

    public function updateArt($id = 0, $data = array()){
         $this->where("id = " . $id)->save($data);
    }

    protected function _before_update(&$data,$options) {
        $data["contents"] = "ppppppp";
    }

    protected function _after_update($data,$options) {
        $this->add($data);
    }
}

引用TP手册中关于M方法和D方法的介绍,总结一下:

D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化系统的ThinkModel基类,同时对于已实例化过的模型,不会重复去实例化。

D方法实例化模型类的时候通常是实例化某个具体的模型类,如果你仅仅是对数据表进行基本的CURD操作的话,使用M方法实例化的话,由于不需要加载具体的模型类,所以性能会更高。

M方法实例化的时候,默认情况下是直接实例化系统的ThinkModel类。


声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。