博客列表 >TP框架中的M、D、C、I、A、S方法

TP框架中的M、D、C、I、A、S方法

Whitney的博客
Whitney的博客原创
2019年01月25日 17:54:122245浏览

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配置值作为默认。


 

 

 


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议