thinkPHP中MVC模式的分析(一)

thinkPHP中MVC模式的分析(一)

M(model)– 模型类

模型

在ThinkPHP中基础的模型类就是Think\Model 类,该类完成了基本的CURD、ActiveRecord模式、连贯操作和统计查询,一些高级特性被封装到另外的模型扩展中。

注意: 基础模型类的设计非常灵活,甚至可以无需进行任何模型定义,就可以进行相关数据表的ORM和CURD操作,只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的。

模型定义

模型类并非必须定义,只有当存在独立的业务逻辑或者属性的时候才需要定义。

模型类通常需要继承系统的\Think\Model类或其子类,下面是一个Home\Model\UserModel类的定义:

    namespace Home\Model;
    use Think\Model;
    class UserModel extends Model{
    }

模型类的作用大多数情况是操作数据库,按照系统的规范来命名模型类的话,大多数情况下是可以自动对应数据表的。

模型名约定对应数据表(假设数据表的前缀定义是think_)
UserModelthink_user
UserTypeModelthink_user_type
模型实例化
一、直接实例化

实例化其他类库一样实例化模型类,例如:

$User = new \Home\Model\UserModel();
$Info = new \Admin\Model\InfoModel();
// 带参数实例化
$New = new \Home\Model\NewModel('blog','think_',$connection);

模型类通常都是继承系统的\Think\Model类,该类的构架方法格式为:
Model(['模型名'],['数据表前缀'],['数据库连接信息']);

三个参数都是可选的,大多数情况下,无需传入任何参数即可实例化。

参数描述
模型名模型的名称 和数据表前缀一起配合用于自动识别数据表名称
数据表前缀当前数据表前缀 和模型名一起配合用于自动识别数据表名称
数据库连接信息当前数据表的数据库连接信息 如果没有则获取配置文件中的

数据表前缀传入空字符串表示取当前配置的表前缀,如果当前数据表没有前缀,则传入null即可。

数据库连接信息参数支持三种格式:
1. 字符串定义
字符串定义采用DSN格式定义,格式定义规范为:数据库类型://用户名:密码@数据库主机名或者IP:数据库端口/数据库名#字符集
例如:
new\Home\Model\NewModel('blog','think_','mysql://root:1234@localhost/demo');
2. 数组定义
可以传入数组格式的数据库连接信息,例如:
php
$connection = array(
'db_type' => 'mysql',
'db_host' => '127.0.0.1',
'db_user' => 'root',
'db_pwd' => '12345',
'db_port' => 3306,
'db_name' => 'demo',
'db_charset' => 'utf8',
);
new \Home\Model\NewModel('new','think_',$connection);

3. 配置定义
我们可以事先在配置文件中定义好数据库连接信息,然后在实例化的时候直接传入配置的名称即可,例如:
“` php
//数据库配置1
‘DB_CONFIG1’=>array(
‘db_type’=>’mysql’,
‘db_user’=>’root’,
‘db_pwd’=>’1234’,
‘db_host’=>’localhost’,
‘db_port’=>’3306’,
‘db_name’=>’thinkphp’
),
//数据库配置2
‘DB_CONFIG2’=>’mysql://root:1234@localhost:3306/thinkphp’,

```

在配置文件中定义数据库连接信息的时候也支持字符串和数组格式,格式和上面的实例传入参数一样
然后通过
new \Home\Model\NewModel('new','think_','DB_CONFIG1');
new \Home\Model\BlogModel('blog','think_','DB_CONFIG2');

通常我们都会在配置文件中配置相关参数,包括:

    'DB_TYPE' => '', // 数据库类型
    'DB_HOST' => '', // 服务器地址
    'DB_NAME' => '', // 数据库名
    'DB_USER' => '', // 用户名
    'DB_PWD' => '', // 密码
    'DB_PORT' => '', // 端口
    'DB_PREFIX' => '', // 数据库表前缀
    'DB_DSN' => '', // 数据库连接DSN 用于PDO方式
    'DB_CHARSET' => 'utf8', // 数据库的编码 默认为utf8

配置文件路径为 \Application\Common\Conf\config.php

二、D方法实例化

D方法其实就是通过实例化自定义模型类来操作数据库,一般在自定义模型类中通过M()方法来实例化数据表,当数据操作重复多次时,可以自定义模型类,然后在C层(控制层)直接调用模型类,可以减小代码重复性

实例化自定义模型类,eg.

<?php
//实例化模型
$User = D('User');
//相当于$User = new \Home\Model\UserModel();
//执行具体的数据操作
$User->select();
?>

\Home\Model\UserModel类不存在的时候,D函数会尝试实例化公共模块下面的\Common\Model\UserModel类,如果不存在,则会实例化系统的\Think\Model基类,同时对于已实例化过的模型,不会重复实例化。

D方法还可以支持跨模块调用,需要使用:
//实例化Admin模块的User模型
D('Admin/User');
//实例化Extend扩展命名空间下的Info模型
D('Extend://Editor/Info');

注意:跨模块实例化模型类的时候 不支持自动加载公共模块的模型类。

三、M方法实例化模型

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

M方法其实就是通过公共模型类来实例化数据表

例如:

//使用M方法实例化
$User = M('User');
//同$User = new \Think\Model('User');
$User->select();

M方法跨模块操作,例如:

//使用M方法实例化操作db_name数据库的ot_user表
$User = M('db_name.User','ot_');
$User->select();

其实一般情况M方法和\Think\Model类的参数是一样的
$New = M('new','think_',$connection);//等效于$New = new \Think\Model('new','think_',$connection);

M方法实例化的时候默认是实例化系统的\Think\Model类,如果我们希望实例化其他的公共模型类的话,可以使用如下方法;

$User = M('\Home\Model\CommonModel:User','think_','db_config');
//相当于$User = new \Home\Model\CommonModel('User','think_','db_config');
实例化空模型

如果仅仅试试用原生的SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作

//实例化空模型
$Model = new Model();
//或者使用M快捷方法是等效的
$Model = M();
//进行原生的SQL查询
$Model->query('SELECT * FROM think_user WHERE status = 1');

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值