THINKPHP中D方法调用逻辑层类

ThinkPHP的D函数十分强大,一般情况下用D方法最多的情况是实例化自定义模型类,实现数据库相关的操作,但是D方法的功能远远不仅于此,D方法还可用于逻辑层,服务层自定义类的实例化。

调用格式如下:

D('[项目://][分组/]模型','模型层名称')

关于D方法的一般用法本文不再描述,就是常见的D(‘User’)实例化Model下面的UserModel.class.php。

我们在LIB_PATH,也就是和Controller(以前版本叫Action),Model文件夹同级的目录建立Logic或者Service文件夹。

ThinkPHP分层模型逻辑层

在Logic文件夹中新建文件UserLogic.class.php,作为用户逻辑业务的一个类,那么实例化这个类的时候,可以用tp自带的D方法,如下:

D('User','Logic');

这样就调用Logic文件夹下的UserLogic.class.php文件并实例化class UserLogic,专业一点的说法是D方法支持分成模型并实例化自定义类。这里的分层模型指的就是Logic和Service这样的目录。

注:分层模型从ThinkPHP 3.1版本开始支持。

我们来看看ThinkPHP D方法的源码:

/**
 * D函数用于实例化模型类 格式 [资源://][模块/]模型
 * @param string $name 资源地址
 * @param string $layer 模型层名称
 * @return Model
 */
function D($name='',$layer='') {
    if(empty($name)) return new Think\Model;
    static $_model  =   array();
    $layer          =   $layer? $layer : C('DEFAULT_M_LAYER');
    if(isset($_model[$name.$layer]))
        return $_model[$name.$layer];
    $class          =   parse_res_name($name,$layer);
    if(class_exists($class)) {
        $model      =   new $class(basename($name));
    }elseif(false === strpos($name,'/')){
        // 自动加载公共模块下面的模型
        $class      =   '\\Common\\'.$layer.'\\'.$name.$layer;
        $model      =   class_exists($class)? new $class($name) : new Think\Model($name);
    }else {
        Think\Log::record('D方法实例化没找到模型类'.$class,Think\Log::NOTICE);
        $model      =   new Think\Model(basename($name));
    }
    $_model[$name.$layer]  =  $model;
    return $model;
}

当然,我们也可以重新写个调用分层模型中自定义类的方法,如:

/**
 * 业务逻辑层调用函数
 * @param string $name 业务模型名称
 * @return object
*/
function logic($name){
    static $_obj=array();
    $layer='Logic';
    $class=$name.$layer;
    if(isset($_obj[$name])){
        return $_obj[$name];
    }
    require LIB_PATH."{$layer}/".$class.'.class.php';
    $_obj[$name] = new $class($name);
    return $_obj[$name];
}

写到tp公共函数中,以后调用Logic分层模型(实际上就是这个文件夹)下的自定义类就可以直接这样用:Logic(‘User’)就ok了。

时间: 2024-08-25 00:54:03

THINKPHP中D方法调用逻辑层类的相关文章

内部类-Java编程中A类如何调用B类中M方法里的C类的实例?

问题描述 Java编程中A类如何调用B类中M方法里的C类的实例? import java.awt.*; import java.awt.event.*; public class TestListener{ public static void main(String[] args){ Counter c1 = new Counter("Hello"); c1.CreatButton(); c1.add(c1.button); ----------------------------(

如何在普通类实例的线程过程中,同步调用执行在类实例自身所在的原来的那个线程中的方法

问题描述 如何在普通类实例的线程过程中,同步调用执行在类实例自身所在的原来的那个线程中的方法如后代码,是一个常见的实例,讲的是通过Control.Invoke在线程函数中,同步调用窗体主线程中的Form1实例的普通方法txt.但问题是,很多时候我们自己自定义的类,并不是从Control类继承的,从而也没有这个功能的Invoke方法供调用,这种类要怎么设计呢?虽然说用的示例代码是vb.net的,但严格来说,这个和语言无关,是一个.net开发的基本问题.ImportsSystemImportsSys

struts中动态方法调用使用通配符_java

一.DMI动态方法调用的其中一种改变form表单中action属性的方式已经讲过了.还有两种,一种是改变struts.xml配置文件中action标签中的method属性,来指定执行不同的方法处理不同的业务逻辑:另外一种是使用通配符的方式.改变method属性的方式需要配置多个action,而且这些action定义的绝大部分都是相同的,所以这种定义是相当冗余的.因此,使用通配符就可以在一个action标签中代替多个逻辑处理的Action. 二.示范:(和之前的动态方法调用改变form表单acti

指针-JVM 中多态方法调用问题

问题描述 JVM 中多态方法调用问题 很多人说对象有 指向方法区的指针.(应该说的是对象头部的Markword中有指向这对象的Class指针)但是如果子类继承一个父类 比如 Father f = new Son(), 这个引用是怎么找到 父类中方法信息的.难道Markword中还有指向 父类class的指针? 我知道 JVM 最终会把 符号引用解析为直接引用,就是想找到,这个 找到方法的直接引用是存在哪里的? 解决方案 不是,通俗地说,派生类其实是在基类的类型上加上派生类的代码合成的一个类型,因

thinkPHP中session()方法用法详解_php实例

本文实例讲述了thinkPHP中session()方法用法.分享给大家供大家参考,具体如下: 系统提供了Session管理和操作的完善支持,全部操作可以通过一个内置的session函数完成. 用法 session(name,name,value='') 参数 name(必须):如果传入数组 则表示进行session初始化,如果传入null表示清空当前session,如果是字符串则表示session赋值.获取或者操作. Value(可选):要设置的session值,如果传入null表示删除sess

thinkPHP中create方法与令牌验证实例浅析_php实例

本文实例讲述了thinkPHP中create方法与令牌验证.分享给大家供大家参考,具体如下: thinkPHP的create方法与令牌验证主要是涉及表单的安全性. 代码如下: <?php // 本类由系统自动生成,仅供测试用途 class IndexAction extends Action{ public function index(){ $this->display(); } //一般用户在网站完成信息的添加修改--但是有意外,用户吧网页另存为到本地了,然后在这当中模拟了很多组数据,然后

ThinkPHP中U方法的使用浅析_php实例

thinkPHP中U方法的定义规则如下(方括号内参数根据实际应用决定): U('[项目://][路由@][分组名-模块/]操作? 参数1=值1[&参数N=值N]')或者用数组的方式传入参数:U('[项目://][路由@][分组名-模块/]操作',array('参数1'=>'值1' [,'参数N'=>'值N'])) 如果不定义项目和模块的话 就表示当前项目和模块名称,下面是一些简单的例子: U('Myapp://User/add') // 生成Myapp项目的User模块的add操作的U

thinkPHP中_initialize方法实例分析_php实例

本文实例讲述了thinkPHP中_initialize方法.分享给大家供大家参考,具体如下: 子类的_initialize方法自动调用父类的_initialize方法.而php的构造函数construct,如果要调用父类的方法,必须在子类构造函数显示调用parent::__construct(); <?php class BaseAction extends Action { // 继承Thinkphp protected function _initialize() { // thinkphp

thinkPHP中session()方法用法详解

本文实例讲述了thinkPHP中session()方法用法.分享给大家供大家参考,具体如下: 系统提供了Session管理和操作的完善支持,全部操作可以通过一个内置的session函数完成. 用法 session(name,name,value='') 参数 name(必须):如果传入数组 则表示进行session初始化,如果传入null表示清空当前session,如果是字符串则表示session赋值.获取或者操作. Value(可选):要设置的session值,如果传入null表示删除sess