ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 模型实例化 [上一页](# "上一页")[下一页](# "下一页") 在ThinkPHP中,可以无需进行任何模型定义。只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的,因此ThinkPHP在模型上有很多的灵活和方便性,让你无需因为表太多而烦恼。 根据不同的模型定义,我们有几种实例化模型的方法,下面来分析下什么情况下用什么方法:**1、实例化基础模型(Model) 类** 在没有定义任何模型的时候,我们可以使用下面的方法实例化一个模型类来进行操作:`//实例化User模型 $User = new Model('User'); //或者使用M()快捷方法实例化,和上面的方法是等效的 $User = M('User'); //执行其他的数据操作 $User->select();`这种方法最简单高效,因为不需要定义任何的模型类,所以支持跨项目调用。缺点也是因为没有自定义的模型类,因此无法写入相关的业务逻辑,只能完成基本的CURD操作。**2、实例化其他公共模型类** 第一种方式实例化因为没有模型类的定义,因此很难封装一些额外的逻辑方法,不过大多数情况下,也许只是需要扩展一些通用的逻辑,那么就可以尝试下面一种方法。`$User = new CommonModel('User');`模型类的实例化方法有三个参数,第一个参数是模型名称,第二个参数用于设置数据表的前缀(留空则取当前项目配置的表前缀),第三个参数用于设置当前使用的数据库连接信息(留空则取当前项目配置的数据库连接信息),例如:`$User = new CommonModel('User','think_','db_config');`第三个连接信息参数可以使用DSN配置或者数组配置,甚至可以支持配置参数。关于这个参数的使用我们会在数据库连接部分详细描述。 用M方法实现的话,上面的方法可以写成:`$User = M('CommonModel:User','think_','db_config');`M方法默认是实例化Model类,第二个参数用于指定表前缀,第三个参数就可以指定其他的数据库连接信息。 因为系统的模型类都能够自动加载,因此我们不需要在实例化之前手动进行类库导入操作。模型类CommonModel必须继承Model。我们可以在CommonModel类里面定义一些通用的逻辑方法,就可以省去为每个数据表定义具体的模型类,如果你的项目已经有超过100个数据表了,而大多数情况都是一些基本的CURD操作的话,只是个别模型有一些复杂的业务逻辑需要封装,那么第一种方式和第二种方式的结合是一个不错的选择。**3、实例化用户自定义模型(×××Model)类** 这种情况是使用的最多的,一个项目不可避免的需要定义自身的业务逻辑实现,就需要针对每个数据表定义一个模型类,例如UserModel 、InfoModel等等。 定义的模型类通常都是放到项目的Lib\Model目录下面。例如,`<?php     class UserModel extends Model{         public function getTopUser(){             //添加自己的业务逻辑              // ...         }     }`其实模型类还可以继承一个用户自定义的公共模型类,而不是只能继承Model类。 要实例化自定义模型类,可以使用下面的方式:`<?php     //实例化自定义模型     $User = new UserModel();     //或者使用D快捷方法     $User = D('User');     //执行具体的数据操作     $User->select();`D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化Model基类,同时对于已实例化过的模型,不会重复去实例化。 D方法还可以支持跨项目和分组调用,需要使用:`//实例化Admin项目的User模型 D('Admin://User') //实例化Admin分组的User模型 D('Admin/User')`**4、实例化空模型类** 如果你仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了,例如:`//实例化空模型 $Model = new Model(); //或者使用M快捷方法是等效的 $Model = M(); //进行原生的SQL查询 $Model->query('SELECT * FROM think_user WHERE status = 1');`空模型类也支持跨项目调用。我们在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。 在后面的内容中,针对M方法或者D方法将不再具体说明,请自行分析。 [上一页](# "上一页")[下一页](# "下一页")