ThinkPHP实例化模型的多种艺术

  那些第两种实例化模型方法与第三种的界别在于:在你的事情逻辑个中,常常状态下会有部分公共的职业逻辑,那您用第三种M(‘表名’,’模型名’);如M(‘user’,’CommonModel’)会更便利;

2、实例化贰个没有模型文件的Model

   class UserModel extends Model{
       function pyj(){
           echo ‘pengyanjie’;
           //其余的有个别数据库操作方法
       }
   }


   该类名user与表名user相对应,所以在UserAction中实例化这些模型的时候就无需再额外的传表名了

3、Model类构造函数 public function __construct($name=”,$connection=”) {
// 模型开首化
$this->_initialize();
// 获取模型名称
if(!empty($name)) {
$this->name = $name;
}elseif(empty($this->name)){
$this->name = $this->getModelName();
}
// 数据库早先化操作
// 获取数据库操作对象
// 当前模型有单独的数据库连接消息
$this->db(0,empty($this->connection)?$connection:$this->connection);
// 设置表前缀
$this->tablePrefix =
$this->tablePrefix?$this->tablePrefix:C(‘DB_PREFIX’);
$this->tableSuffix =
$this->tableSuffix?$this->tableSuffix:C(‘DB_SUFFIX’);
// 字段检查评定
if(!empty($this->name) && $this->autoCheckFields)
$this->_checkTableInfo();
}

   UserAction.class.php

function D($name=”, $app=”) {
static $_model = array();
if (empty($name))
return new Model;
if (empty($app))
$app = C(‘DEFAULT_APP’);
if (isset($_model[$app . $name]))
return $_model[$app . $name];
$OriClassName = $name;
if (strpos($name, ‘.’)) {        //
确认Model类文件名是否aaa.bbb.ccc结构
$array = explode(‘.’, $name);
$name = array_pop($array); //
对于类似aaa.bbb.ccc结构文件名的Model类,只取到首节
$className = $name . ‘Model’;
import($app . ‘.Model.’ . implode(‘.’, $array) . ‘.’ . $className);
} else {
$className = $name . ‘Model’;
import($app . ‘.Model.’ . $className);
}
if (class_exists($className)) {
$model = new $className();
} else {
$model = new Model($name);
}
$_model[$app . $OriClassName] = $model;
return $model;
}

(1)、D方法可以自动物检疫查实验模型类,不存在时,它会抛出三个可怜。同时对于已实例化过的模型,不会去重新实例化。默许的D方法,只好选拔于方今项目上边包车型客车模子。

总结:

   或许,你供给实例化几个表,同时呢,实例化二个谈得来写的自定义的数据库操作类

  1. 幸免重新加载一个模型,即,为了对同一个模子只实例化叁次,二种方法中都行使了静态数组变量压实例化记录。

  2. D方法的回到结果有二种:name为空则重返航空模型型实例;已经实例化就回到实例;载入相应模型文件并回到实例。当中载入模型重返实例的具体操作分为两步:第一步,依据参数确认模型文件目录并载入模型文件。第二步,判别类是还是不是早就存在,便是还是不是加载成功,也等于说模型文件是还是不是存在规定目录,然后利用加载模型文件或模型基类实例化模型,最后回来实例。

  3. M方法正是重临一个一度存在的实例可能再次来到三个新的(Model也许其它模型类)实例。

   Test.Model.class.php

1、实例化二个Model

1、成立八个基础模型:实例化三个系统自带的数据库操作类

迎接大家访问作者自身架的博客站点 CatRoll 工作室!


function M($name=”, $) {
static $_model = array();
if (!isset($_model[$name . ‘_’ . $class]))
$_model[$name . ‘_’ . $class] = new $class($name);
return $_model[$name . ‘_’ . $class];
}

   UserAction.class.php

   function user(){
       $user=D(‘User’);//实例化自定义的数据库操作类
       //等同于$user=new UserModel();
       $user->pyj();//调用User模型中的pyj方法
   }  

   function user(){
       $user=new UserModel();//等同于$user=D(‘User’);
       $list=$user->select();
       dump($list);
       echo $user->aa();
   }

   UserModel.class.php

2、实例化三个自定义模型

   UserAction.class.php

   $user=new Model();//等价与$user=M();
   $list=$user->query(‘select * from think_user’);
//使用古板的sql语句的不二等秘书诀,如若那样的话,就亟须求加表前缀 
   dump($list);

   假若数据库操作比较复杂,就供给在自定义的Model类中增多一些自定义的数据库操作方法

4、实例化一个航空模型型,它并不知道你要实例化操作时用到的是哪张表。

   class UserModel extends Model{
       function aa(){
           echo ‘pengyanjie’;
       }
   }

   UserModel.class.php

   function love(){
       $love=M(‘test’,’UserModel’);    
       //$love=new UserModel(‘test’); 
       $list=$love->select();
       dump($list);
       $love->pyj();
   }  
  
3、实例化四个用户模型

(2)、如若说,小编那是前台应用,然而自己想实例化后台项指标模子能够用D解决。
   
       $user=D(‘admin’,’user’);//会去自动找admin分组下的user模型类
   
       或者
      
       $user=D(‘admin.user’);

附:$user=new UserModel();与$user=D(‘user’);的区别:

  第两种实例化模型方法适于于针对所操作表的更是错综相连的专门的学业逻辑,可是它不须求选用到公共事务逻辑。(它的事务逻辑,针对用户表,它是不今不古的,并且无需在其他模型在那之中使用)。

   class TestModel extends Model{
      
   }

   function test(){
       $test=M(‘test’);//表示实例化的是自带的Model类,并且传入test值表示操作的是test表
       //等同于$test=new TestModel();
       $test=$test->select();
       print_r($test);//输出test表中颇具数据
   }  

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图