TP框架中的M、D、C、I、A、S方法
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’);
实例化基础模型类(Model)
在没有定义任何模型的时候,可以使用下面的操作,这种方法简单高效,但是确定就是没有自定义的模型类,无法写入相关的逻辑。只能完成基本的CURD操作。如果你的模型类中有自己的业务逻辑,是无法使用M方法的。
实例化User模型$User = new Model(‘User’);
或者使用M()快捷方法实例化,和上面的方法时等效的$User = M(‘User’);
//执行其他的数据操作$User->select();
实例化其他模型类
第一种因为没有模型类的定义,很难封装一些额外的逻辑方法。如果只是需要扩展一些通用的逻辑,可以尝试下面的方法
$User = new CommonModel(‘User’,’think_’,’db_config’);
第三个使用M方法
$User = M(‘CommonModel:User’,’think_’,’db_config’);
M方法默认是实例化model类
D方法
D实例化的是你自己在Model文件夹下面建立的模型文件
D就是在你没有定义模型的时候,系统自动帮你定义一个模型,这样才能进行简单的数据输入或者输出。
每一个Action文件都应该对应Model文件的,如果你定义了Model的话,
如:$Form = D(‘User’)就可以改成$Form = new UserModel();(User是指你的模型文件名)
$User = D(‘User’);
相当于:
$User = new /Home/Model/UserModel();
//执行操作$User->select();
如果Home/Model/UserModel不存在的话,就会尝试实例化公共模型下的/Common/Model/userMode类。
D方法的参数就是实例化的名称,并且和模型类的大小写的定义是一致的。
参数 | 实例化的模型文件(假设当前模块为Home) |
User | 对应的模型类文件的 /Home/Model/UserModel.class.php |
UserType | 对应的模型类文件的 /Home/Model/UserTypeModel.class.php |
如果要是在Linux下,要注意大小写
D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化系统的/Think/Model基类,同时对于已实例化的模型,不会重复去实例化,
D方法还可以跨模块调用,需要使用:
//实例化Admin的User模型D(‘Admin/User’);
//实例化Extend扩展命名空间下的Info模型D(‘Extend://Editor/Info’):
注意:跨模块实例化模型类的时候,不支持自动加载公共模块的模型类。
C方法
定义了配置文件之后,可以使用系统提供的C方法来读取已有额配置
获取已经设置的参数值:C(‘参数名称’)
$model = C(‘URL_MODEL’);//尽量使用大写
如果URL_MODEL尚未存在设置,则返回NULL
因为配置参数是全局有效的,因此C方法可以在任何地方读取任何配置,即使某个设置参数以及生效过期了
A方法
如果需要跨控制机调用的话,可以单独实例化
//实例化Home模块的User控制器$User = new /Home/Controller/UserController();
//实例化Admin模块的blog控制器$Blog = new /Admin/Controller/BlogController();
上面的代码是不是很多,这里提供了一个快捷调用方法A
简化后如下
//假设当前模块是Home模块
$User = A(‘User’);
$Blog = A(‘Admin/Blog’);
默认情况下,A方法实例化的是默认控制器(Controller),如果你要实例化其他的分层控制器的话,可以使用
//假设当前模块是Home模块
//实例化Event控制器
$User = A(‘User’); 等效于: new /Home/Event/UserEvent();
$Blog = A(‘Admin/Blog’,’Event’) 等效于 new /Admin/Event/BlogEvent();
A方法
在web开发过程中,我们经常要获取系统变量或者用户提交的数据,这些数据处理不好就会引起安全隐患,所以tp给我们提供了一个变量获取功能。
我们先看下传统获取方式:
$id = $_GET[‘id’];
$name = $_POST[‘name’];
$value = $_SESSION[‘value’];
$name = $_COOKIE[‘name’];
传统获取方法没有同意的安全机制,后期调整比较麻烦,更好的方式是在框架中统一使用I函数进行变量获取和过滤
I方法时TP用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:
I(‘变量类型.变量名/修饰符’,[‘默认值’],[‘过滤方法或正则’],[‘额外数据源’])
变量类型是指请求方式或者输入类型
变量类型
含义
Get
获取get参数
Post
获取post参数
Param
自动判断请求类型获取GET/POST/PUT参数
Request
获取request参数
Put
获取put参数
Session
获取$_SESSION参数
Cookie
获取$_COOKIE参数
Server
获取$_SERVER参数
Globals
获取$_GLOBAL参数
Path
获取PATHINFO模式的URL参数
Data
获取其他类型的参数,需要配合额外数据源参数
注意:变量类型不区分大小写,变量名严格区分大小写。默认值和过滤方法均属于可选参数
下面是I方法范例使用:
echo I(‘get.id’);//相当于$_GET[‘id’]
支持默认值:
Echo I(‘get.id’,0)//如果不存在$_GET[‘id’] 则返回0
采用方法过滤:
Echo I(‘get.name’,’’,’htmlspecialchars’);
//采用htmlspecialchars方法对$_GET[‘name’]进行过滤,如果不存在则返回空字符串
支持直接获取整个变量值
I(‘get.’)
用同样的方式可以获取post或者其他输入类型的变量
Param变量类型是框架特有的支持自动判断当前请求类型的变量获取方式,例如:
Echo I(‘param.id’)
如果当前请求类型是GET,那么等效于$_GET[‘id’],如果当前请求类型是POST或者是PUT,那么相当于获取$_POST[‘id’]或者$_PUT[‘id’].
由于param类型是I函数默认获取的变量类型,因此事实上param变量类型的写法可以简化为:I(‘id’)
Path类型变量可以用于获取URL参数(必须是pathinfo模式参数有效,无论是get还是post方式都有效),例如:
当前访问地址为 http://serverName/index.php/New/2013/06/01
echo I(‘path.1’)//输出2013
echo I(‘path.2’)//输出06
data类型变量可以用于获取不支持的变量类型额读取,例如:
I(‘data.file1’,‘’,‘’,$_FILES);
变量过滤
如果你没有在调用I函数的时候指定过滤方法的话,系统会采用默认的过滤机制(由DEFAULT_FILTER配置),事实上,该参数的默认设置是:
//系统默认的变量过滤机制 ‘DEFAULT_FLITER’=>’htmlspecialchars’
也就是说,I方法的所有获取变量如果没有设置过滤方法的话都会进行htmlspecialchars过滤,那么:
I(‘get.name’)等同于htmlspecialchars($_GET[‘name’])
同样,该参数也可以设置支持多个过滤,例如:
‘DEFAULT_FLITER’=>’strip_tags,htmlspecialchars’
设置后,我们在使用
I(‘get.name’)等同于htmlspecialchars(strip_tags($_GET[‘name’]))
如果我们在使用I方法的时候 指定了过滤方法,那么就会忽略DEFAULT_FLITER的设置,例如:
I(‘get.name’,’’,’strip_tags’); 等价于 strip_tags($_GET[‘name’])
I方法的第三个参数如果传入函数名,则表示调用该函数对变量进行过滤并返回(在变量是数组的情况下自动使用array_map进行过滤处理),否则会调用PHP内心hi额fliter_var方法进行过滤处理,例如:
I(‘post.email’,’’,,FLITER_VALIDATE_EMAIL);
表示会对$_POST[‘email’]进行格式验证,如果不符合要求的话,返回空字符串。或者可以用下面的字符标识方式:
I(‘post.email’,‘’,‘email’)
还可以支持进行正则匹配过滤,例如:
I(‘get,name’,’’,’/^[A-Za-z]+$/’)//采用正则表达式进行变量过滤
如果正则匹配不通过的话,则返回默认值
在有些特殊的情况下,我们不希望进行任何过滤,即使DEFAULT_FLITER已经有所设置,可以使用:
I(‘get.name’,’’,’’)
I(‘get.id’,’’,’false’)
这两种方式不采用任何过滤方法
一旦过滤参数设置为空字符创或者false,即表示不再进行任何的过滤。
S方法
读取数据缓存,而且是要设置DATA_CACHE_TYPE配置
在tp中进行缓存操作,一般情况下并不需要直接操作缓存类,因为系统内置对缓存操作进行了封装,直接采用S方法即可,例如:
1. 缓存初始化
2. S(array(‘type’=>’xcache’,’expire’=>60))
缓存初始化可以支持的参数根据不同的缓存方式有所区别,常用的参数是:
参数
描述
Expire
缓存有效期(时间为秒)
Prefix
缓存标识前缀
Type
缓存类型
如果S方法不传入type参数初始化的话,则读取配置文件中设置的DATA_CACHE_TYPE参数值作为默认类型。同样的道理,prefix参数如果没有传入会读取配置文件中的DATA_CACHE_PREFIX参数值,expire参数没有传入则读取DATA_CACHE_TIME配置值作为默认。