• thinkphp 模型实例化


    在ThinkPHP中,可以无需进行任何模型定义。只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的,因此ThinkPHP在模型上有很多的灵活和方便性,让你无需因为表太多而烦恼。

    根据不同的模型定义,我们有几种实例化模型的方法,根据需要采用不同的方式:

    直接实例化

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

    1. $User = new HomeModelUserModel();
    2. $Info = new AdminModelInfoModel();
    3. // 带参数实例化
    4. $New = new HomeModelNewModel('blog','think_',$connection);

    模型类通常都是继承系统的ThinkModel类,该类的架构方法有三个参数,分别是:

    Model(['模型名'],['数据表前缀'],['数据库连接信息']);

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

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

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

    数据库连接信息参数支持三种格式:

    1、字符串定义

    字符串定义采用DSN格式定义,格式定义规范为:

    1. type://username:passwd@hostname:port/DbName
    2. // 3.2.1以上版本还可以支持字符集设定
    3. type://username:passwd@hostname:port/DbName#charset

    例如:

    1. new HomeModelNewModel('blog','think_','mysql://root:1234@localhost/demo');
    2、数组定义

    可以传入数组格式的数据库连接信息,例如:

    1. $connection = array(
    2. 'db_type' => 'mysql',
    3. 'db_host' => '127.0.0.1',
    4. 'db_user' => 'root',
    5. 'db_pwd' => '12345',
    6. 'db_port' => 3306,
    7. 'db_name' => 'demo',
    8. );
    9. new HomeModelNewModel('new','think_',$connection);

    3.2.1以上版本还可以支持数据编码设定,例如:

    1. $connection = array(
    2. 'db_type' => 'mysql',
    3. 'db_host' => '127.0.0.1',
    4. 'db_user' => 'root',
    5. 'db_pwd' => '12345',
    6. 'db_port' => 3306,
    7. 'db_name' => 'demo',
    8. 'db_charset' => 'utf8',
    9. );
    10. new HomeModelNewModel('new','think_',$connection);

    3.2.3开始还可以支持数据的部署模式和调试模式设定,例如:

    1. $connection = array(
    2. 'db_type' => 'mysql',
    3. 'db_host' => '192.168.1.2,192.168.1.3',
    4. 'db_user' => 'root',
    5. 'db_pwd' => '12345',
    6. 'db_port' => 3306,
    7. 'db_name' => 'demo',
    8. 'db_charset' => 'utf8',
    9. 'db_deploy_type'=> 1,
    10. 'db_rw_separate'=> true,
    11. 'db_debug' => true,
    12. );
    13. // 分布式数据库部署 并且采用读写分离 开启数据库调试模式
    14. new HomeModelNewModel('new','think_',$connection);

    注意,如果设置了db_debug参数,那么数据库调试模式就不再受APP_DEBUG常量影响。

    3、配置定义

    我们可以事先在配置文件中定义好数据库连接信息,然后在实例化的时候直接传入配置的名称即可,例如:

    1. //数据库配置1
    2. 'DB_CONFIG1' => array(
    3. 'db_type' => 'mysql',
    4. 'db_user' => 'root',
    5. 'db_pwd' => '1234',
    6. 'db_host' => 'localhost',
    7. 'db_port' => '3306',
    8. 'db_name' => 'thinkphp'
    9. ),
    10. //数据库配置2
    11. 'DB_CONFIG2' => 'mysql://root:1234@localhost:3306/thinkphp',

    在配置文件中定义数据库连接信息的时候也支持字符串和数组格式,格式和上面实例化传入的参数一样。

    然后,我们就可以这样实例化模型类传入连接信息:

    1. new HomeModelNewModel('new','think_','DB_CONFIG1');
    2. new HomeModelBlogModel('blog','think_','DB_CONFIG2');

    事实上,当我们实例化的时候没有传入任何的数据库连接信息的时候,系统其实默认会获取配置文件中的相关配置参数,包括:

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

    如果应用配置文件中有配置上述数据库连接信息的话,实例化模型将会变得非常简单。

    D方法实例化

    上面实例化的时候我们需要传入完整的类名,系统提供了一个快捷方法D用于数据模型的实例化操作。

    要实例化自定义模型类,可以使用下面的方式:

    1. <?php
    2. //实例化模型
    3. $User = D('User');
    4. // 相当于 $User = new HomeModelUserModel();
    5. // 执行具体的数据操作
    6. $User->select();

    当 HomeModelUserModel 类不存在的时候,D函数会尝试实例化公共模块下面的 CommonModelUserModel 类。

    D方法的参数就是模型的名称,并且和模型类的大小写定义是一致的,例如:

    参数实例化的模型文件(假设当前模块为Home)
    User 对应的模型类文件的 HomeModelUserModel.class.php
    UserType 对应的模型类文件的 HomeModelUserTypeModel.class.php

    如果在Linux环境下面,一定要注意D方法实例化的时候的模型名称的大小写。

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

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

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

    广东大理石平台

    M方法实例化模型

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

    例如:

    1. // 使用M方法实例化
    2. $User = M('User');
    3. // 和用法 $User = new ThinkModel('User'); 等效
    4. // 执行其他的数据操作
    5. $User->select();

    M方法也可以支持跨库操作,例如:

    1. // 使用M方法实例化 操作db_name数据库的ot_user表
    2. $User = M('db_name.User','ot_');
    3. // 执行其他的数据操作
    4. $User->select();

    M方法的参数和ThinkModel类的参数是一样的,也就是说,我们也可以这样实例化:

    1. $New = M('new','think_',$connection);
    2. // 等效于 $New = new ThinkModel('new','think_',$connection);

    具体的参数含义可以参考前面的介绍。

    M方法实例化的时候,默认情况下是直接实例化系统的ThinkModel类,如果我们希望实例化其他的公共模型类的话,可以使用如下方法:

    1. $User = M('HomeModelCommonModel:User','think_','db_config');
    2. // 相当于 $User = new HomeModelCommonModel('User','think_','db_config');

    如果你的模型类有自己的业务逻辑,M方法是无法支持的,就算是你已经定义了具体的模型类,M方法实例化的时候是会直接忽略。

    实例化空模型类

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

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

    实例化空模型类后还可以用table方法切换到具体的数据表进行操作

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

  • 相关阅读:
    南京邮电大学网络攻防训练平台(NCTF)-异性相吸-Writeup
    SniperOJ-as fast as you can-Writeup
    SniperOj-compare_flag-Writeup
    妙用python之编码转换
    虚拟机安装archLinux+xfce桌面教程(更新时间2017-5-8)
    2017年陕西省网络空间安全技术大赛——人民的名义-抓捕赵德汉2——Writeup
    2017年陕西省网络空间安全技术大赛——一维码——Writeup
    2017年陕西省网络空间安全技术大赛——人民的名义-抓捕赵德汉1——Writeup
    2017年陕西省网络空间安全技术大赛——种棵树吧——Writeup
    整除15问题——北理工网教
  • 原文地址:https://www.cnblogs.com/furuihua/p/11792248.html
Copyright © 2020-2023  润新知