NetworkOptimizationExpertTeam内容摘要①模型定义和规范②模型实例化③字段缓存(9讲)模型操作-模型实例化(9讲)模型操作-模型实例化1.1 模型定义和规范(9讲)模型操作-模型实例化2 模型实例化在ThinkPHP中,可以无需进行任何模型定义。只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的,根据不同的模型定义,我们有几种实例化模型的方法,下面来分析下什么情况下用什么方法:1、实例化基础模型(Model)类在没有定义任何模型的时候,我们可以使用下面的方法实例化一个模型类来进行操作://实例化User模型$User=newModel(User);//或者使用M()快捷方法实例化,和上面的方法是等效的$User=M(User);//执行其他的数据操作$User-select();这种方法最简单高效,因为不需要定义任何的模型类,所以支持跨项目调用。缺点也是因为没有自定义的模型类,因此无法写入相关的业务逻辑,只能完成基本的CURD操作(9讲)模型操作-模型实例化2 模型实例化一个项目不可避免的需要定义自身的业务逻辑实现,就需要针对每个数据表定义一个模型类,例如UserModel、InfoModel等等。定义的模型类通常都是放到项目的Lib\Model目录下面。例如,?phpclassUserModelextendsModel{publicfunctiongetTopUser(){//添加自己的业务逻辑//...}}其实模型类还可以继承一个用户自定义的公共模型类,而不是只能继承Model类。要实例化自定义模型类,可以使用下面的方式:(9讲)模型操作-模型实例化2 模型实例化?php//实例化自定义模型$User=newUserModel();//或者使用D快捷方法$User=D(User);//执行具体的数据操作$User-select();D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化Model基类,同时对于已实例化过的模型,不会重复去实例化。D方法还可以支持跨项目和分组调用,需要使用://实例化Admin项目的User模型D(Admin://User)//实例化Admin分组的User模型D(Admin/User)(9讲)模型操作-模型实例化2 模型实例化实例化空模型类如果你仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了,例如://实例化空模型$Model=newModel();//或者使用M快捷方法是等效的$Model=M();//进行原生的SQL查询$Model-query(SELECT*FROMthink_userWHEREstatus=1);空模型类也支持跨项目调用。我们在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。(9讲)模型操作-模型实例化3 字段缓存通常情况下,你无须在模型类里面手动定义数据表的字段,系统会在模型首次实例化的时候自动获取数据表的字段信息(而且只需要一次,以后会永久缓存字段信息,除非设置不缓存或者删除),如果是调试模式则不会生成字段缓存文件,则表示每次都会重新获取数据表字段信息。字段缓存保存在Runtime/Data/_fields/目录下面,缓存机制是每个模型对应一个字段缓存文件(而并非每个数据表对应一个字段缓存文件),命名格式是:数据库名.模型名.php例如:thinkphp.User.php表示User模型生成的字段缓存文件thinkphp.Article.php表示Article模型生成的字段缓存文件字段缓存包括数据表的字段信息、主键字段和是否自动增长,如果开启字段类型验证的话还包括字段类型信息等等,无论是用M方法还是D方法,或者用原生的实例化模型类一般情况下只要是不开启调试模式都会生成字段缓存(字段缓存可以单独设置关闭)。(9讲)模型操作-模型实例化3 字段缓存从3.1版本开始,模型的字段缓存文件名全部转换成小写,避免重复生成。可以通过设置DB_FIELDS_CACHE参数来关闭字段自动缓存,如果在开发的时候经常变动数