ThinkPHP中_after_update、_before_update等的用法

举报
lxw1844912514 发表于 2022/03/27 04:13:40 2022/03/27
【摘要】 https://blog.csdn.net/aslackers/article/details/50339163 TP系统\Think\Model类里隐藏了几个有用的方法: _before_insert、_after_insert、_before_delete 、_after_delete、_before_update、_...

https://blog.csdn.net/aslackers/article/details/50339163

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

_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都没触发,但在系统的\Think\Model类里却能触发,手册中关于M方法和D方法,发现这句:M方法实例化的时候,默认情况下是直接实例化系统的\Think\Model类。而我平时在写自定义模型层时,习惯在模型层里先M一下自己,找到问题,修改自定义模型层: --------------------- 本文来自 aslackers 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/aslackers/article/details/50339163?utm_source=copy

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);
    }
}

 

结果发现,_before_update和_after_update都没触发,但在系统的\Think\Model类里却能触发,手册中关于M方法和D方法,发现这句:M方引用TP手册中关于M方法和D方法的介绍,总结一下:

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

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

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

--------------------- 本文来自 aslackers 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/aslackers/article/details/50339163?utm_source=copy 法实例化的时候,默认情况下是直接实例化系统的\Think\Model类。而我平时在写自定义模型层时,习惯在模型层里先M一下自己,找到问题,修改自定义模型层: --------------------- 本文来自 aslackers 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/aslackers/article/details/50339163?utm_source=copy

法实例化的时候,默认情况下是直接实例化系统的\Think\Model类。而我平时在写自定义模型层时,习惯在模型层里先M一下自己,找到问题,修改自定义模型层: --------------------- 本文来自 aslackers 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/aslackers/article/details/50339163?utm_source=copy

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/100027521

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。