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

ThinkPHP中_after_update、_before_update等的用法的更多相关文章

  1. Thinkphp中的内置标签用法

    Thinkphp中的内置标签有:Volist,Foreach,For,Switch,比较标签,范围判断标签,IF,Present,Empty,Defined,Assign,Define,标签嵌套,im ...

  2. Thinkphp中import的几个用法详细介绍

    下面附上import的几个用法介绍 1.用法一 import('@.Test.Translate');@,表示项目根目录.假定根目录是:App/导入类库的路径是:App/Lib/Test/Transl ...

  3. ThinkPHP中,display和assign用法详解

    thinkphp 模板显示display和assign的用法 $this->assign('name',$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论 ...

  4. thinkphp中F方法

    我们已经了解了ThinkPHP中的S方法的用法,F方法其实是S方法的一个子集功能,仅用于简单数据缓存,并且只能支持文件形式,不支持缓存有效期,因为采用的是PHP返回方式,所以其效率较S方法较高,因此我 ...

  5. Thinkphp中distinct的用法

    Thinkphp中distincat的用法 TP中distinct()的用处主要是去除重复的值 在Thinkphp手册中也详细说明了(链接:http://document.thinkphp.cn/ma ...

  6. thinkphp中memcache的用法实例

    本文实例讲述了thinkphp中memcache的用法.分享给大家供大家参考.具体分析如下: 1.下载并安装memcache ① window下安装memcache. 下载memcached.exe ...

  7. thinkPHP中session()方法用法详解

    本文实例讲述了thinkPHP中session()方法用法.分享给大家供大家参考,具体如下: 系统提供了Session管理和操作的完善支持,全部操作可以通过一个内置的session函数完成. 用法 ? ...

  8. ThinkPHP中Session用法详解

    在ThinkPHP封装了Session类,用户可以直接使用,常用的方法有: Session::set(name, value):注册 session . Session::is_set(name):检 ...

  9. [转]ThinkPHP中实例化对象M()和D()的区别,select和find的区别

    1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会 ...

随机推荐

  1. Python中的urlparse、urllib抓取和解析网页(一)

    对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...

  2. vue.js_07_vue-resource的请求方式

    1.vue-resource 实现 get, post, jsonp请求 <body> <div id="app"> <input type=&quo ...

  3. JAVA开源微信管家平台——JeeWx捷微V3.3版本发布(支持微信公众号,微信企业号,支付窗)

    JeeWx捷微V3.3版本紧跟微信小程序更新,在原有多触点版本基础上,引入了更多的新亮点:支持微信公众号.微信企业号.支付宝服务窗等多触点开发:采用微服务框架实现,可插拔可集成,轻量级开发:对小程序的 ...

  4. 【DM642学习笔记十】DSP优化记录

    1. 处理的数据先EDMA到片内,具有更高的效率! 以YUV2RGB为例: #pragma DATA_SECTION(onchipBuf0_y,".INTPROCBUFF"); # ...

  5. Uva10795 A Different Task

    A Different Task https://vjudge.net/problem/UVA-10795 题目大意:给定一个汉诺塔初末状态,求从初状态到末状态最少需要多少步. 考虑最大的一个初末不同 ...

  6. vue的事件绑定

    vue事件有两方面内容:DOM事件 和 自定义事件. DOM事件 vue中采用DOM2级事件的处理方式,为IE9以上的浏览器服务.下面我们先来讲解一下什么是DOM2级事件吧! JS中DOM0级事件有两 ...

  7. web前端学习(一) j2ee环境搭配+jsp中的编码问题

    jsp中的编码问题 pageEncoding是jsp文件本身的编码  contentType的charset是指服务器发送给客户端时的内容编码 我安装tomcat的方法是 安装j2ee的eclipse ...

  8. What every computer science major should know 每一个计算机科学专业的毕业生都应该都知道的

    Given the expansive growth in the field, it's become challenging to discern what belongs in a modern ...

  9. 直接在安装了redis的Linux机器上操作redis数据存储类型--set类型

    一.概述:   在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加.删除或判断某一元素是否存在等操作.需要说明的是,这些操作的时间复 ...

  10. INotitypropertyChanged

    WPF数据绑定(要是后台类对象的属性值发生改变,通知在“client界面与之绑定的控件值”也发生改变须要实现INotitypropertyChanged接口) MainWindow.xaml < ...