ThinkPHP函数方法总结

1. S方法:动态缓存方法

持缓存有效期和缓存队列

S($name,$value='',$options=null)

@param mixed $name 缓存名称,如果为数组表示进行缓存设置

@param mixed $value 缓存值

@param mixed $options 缓存参数

@return mixed


示例:

//当前的缓存方式传入缓存参数
S('data',$Data,3600,'File',array('length'=>10,'temp'=>RUNTIME_PATH.'temp/'));
// 使用data标识缓存$Data数据
S('data',$Data);
// 缓存$Data数据3600秒
S('data',$Data,3600);
// 获取缓存数据
$Data = S('data');
// 删除缓存数据
S('data',NULL);

默认采用File方式缓存。可以在项目配置文件里面修改:

    1. 'DATA_CACHE_TYPE'=>'Xcache';//设置为默认缓存方式为Xcache(环境需要支持Xcache)
    2. 'DATA_CACHE_SUBDIR'=>TRUE;  //启用哈希子目录缓存的方式
    3. 'DATA_PATH_LEVEL'=>2;       //设置哈希目录的层次,根据缓存标识的哈希自动创建多层子目录来缓存

也可以在S方法里面显示指定缓存方式,如:

    1. S('data',$Data,3600,'File');
为了更加方便的操作缓存,3.1版本新增了cache函数用以设置和操作缓存。 (如果是3.1版本以上,建议用新增的cache方法替代S方法)

使用方法:


    1. cache(array('type'=>'xcache','expire'=>60));//1 缓存初始化
    2. cache('a',$value);//2 缓存设置
    3. $value = cache('a');//3 缓存读取
    4. cache('a',null);//4 缓存删除

需要使用不同的缓存方式的时候 需要重新初始化,如果不初始化直接调用的话,则会按照系统配置自动初始化。

初始化的返回值,可以直接操作缓存:

    1. $cache = cache(array('type'=>'xcache','expire'=>60));
    2. $cache->set('name',$value);
    3. $cache->get('name');
    4. $cache->rm('name');

或者

    1. $cache = cache(array('type'=>'xcache','expire'=>60));
    2. $cache->name = $value;
    3. echo $cache->name;
    4. unset($cache->name);

2. F方法:快速缓存方法

只能用于缓存简单数据类型,只支持文件形式,不支持有效期和缓存对象。采用的是PHP返回方式,所以效率比S方法高。

F($name, $value='',$path=DATA_PATH)
   @param string $name 缓存名称
  @param mixed $value 缓存值
  @param string $path 缓存路径
  @return mixed

快速缓存Data数据,默认保存在DATA_PATH(该常量在默认配置位于RUNTIME_PATH.'Data/'下面)目录下面

注意:确保你的缓存标识的唯一,避免数据覆盖和冲突。

    1. F('data',$Data);//写入缓存

快速缓存Data数据,保存到指定的目录

    1. F('data',$Data,TEMP_PATH); //写入指定目录的缓存
    2. F('data','',TEMP_PATH);//获取指定目录下的缓存

获取缓存数据

    1. $Data = F('data');

删除缓存数据

    1. F('data',NULL);      //第二个参数传入NULL,则表示删除标识为data的数据缓存。
    2. F('user/*',NULL);//批量删除,要删除user子目录下面的所有缓存数据
    3. F('user/[^a]*',NULL);//使用过滤条件删除

F方法支持自动创建缓存子目录,例如:在DATA_PATH目录下面缓存data数据,如果User子目录不存在,则自动创建(支持子目录缓存以及自动创建

    1. F('User/data',$Data);

系统内置的数据字段信息缓存就是用了快速缓存机制。

F方法和S方法的区别:

F方法:类似php自带的file_put_content和file_get_content,没有太多存在时间的概念,是文件存储数据的方式。常用于文件配置。

S方法:文件缓存,有生命时长,时间到期后缓存内容会得到更新。常用于单页面data缓存。

3. I方法:获取系统输入变量

格式I('变量类型.变量名',['默认值'],['过滤方法'])

变量类型是指请求方式或者输入类型,包括:

变量类型含义
get获取GET参数
post获取POST参数
param自动判断请求类型获取GET、POST或者PUT参数
request获取REQUEST 参数
put获取PUT 参数
session获取 $_SESSION 参数
cookie获取 $_COOKIE 参数
server获取 $_SERVER 参数
globals获取 $GLOBALS参数

注意:变量类型不区分大小写。
变量名则严格区分大小写。
默认值和过滤方法均属于可选参数。

使用方法

    1. echo I('get.id'); // 相当于 $_GET['id']
    2. echo I('get.name'); // 相当于 $_GET['name']
    3. echo I('get.id',0); // 如果不存在$_GET['id'] 则默认返回0
    4. echo I('get.name',''); // 如果不存在$_GET['name'] 则返回空字符串
    5. echo I('get.name','','htmlspecialchars');//采用htmlspecialchars方法对$_GET['name'] 进行过滤,如果不存在则返回空字符串
    6. I('get.'); // 获取整个$_GET 数组
    7. I('post.name','','htmlspecialchars'); // 采用htmlspecialchars方法对$_POST['name'] 进行过滤,如果不存在则返回空字符串
    8. I('session.user_id',0); // 获取$_SESSION['user_id'] 如果不存在则默认为0
    9. I('cookie.'); // 获取整个 $_COOKIE 数组
    10. I('server.REQUEST_METHOD'); // 获取 $_SERVER['REQUEST_METHOD']
    11. echo I('param.id'); //自动判断当前请求类型的变量

变量过滤:

I方法的时候 变量其实经过了两道过滤,首先是全局的过滤,全局过滤是通过配置VAR_FILTERS参数。3.1版本之后,VAR_FILTERS参数的过滤机制已经更改为采用array_walk_recursive方法递归过滤了,主要对过滤方法的要求是必须引用返回,所以这里设置htmlspecialchars是无效的,你可以自定义一个方法,例如:

    1. function filter_default(&$value){
    2. $value = htmlspecialchars($value);
    3. }
配置:

VAR_FILTERS参数设置的是全局过滤机制,而且采用的是递归过滤,对效率有所影响,所以,我们更建议直接对获取变量过滤的方式,除了在I方法的第三个参数设置过滤方法外,还可以采用配置DEFAULT_FILTER参数的方式设置过滤

    1. 'VAR_FILTERS'=>'filter_default'
    2. //'VAR_FILTERS'=>'filter_default,filter_exp'//需要进行多次过滤,filter_exp方法是框架内置的安全过滤方法,用于防止利用模型的EXP功能进行注入攻击。
    3. 'DEFAULT_FILTER'=>'htmlspecialchars'//I方法的所有获取变量都会进行htmlspecialchars过滤
    4. //'DEFAULT_FILTER'        => 'strip_tags,htmlspecialchars'//指定多个过滤方法

示例:

    1. I('get.name'); // 等同于 htmlspecialchars($_GET['name'])
    2. I('get.name','','strip_tags'); // 等同于 strip_tags($_GET['name']),指定了过滤方法以后就忽略DEFAULT_FILTER的设置
    3. I('get.name','',NULL);//表示不再进行任何的过滤。
I方法的第三个参数如果传入函数名,则表示调用该函数对变量进行过滤并返回(在变量是数组的情况下自动使用array_map进行过滤处理),否则会调用PHP内置的filter_var方法进行过滤处理,例如:
  1. I('post.email','',FILTER_VALIDATE_EMAIL);//对$_POST['email'] 进行 格式验证,如果不符合要求的话,返回空字符串。
复制代码
(关于更多的验证格式,可以参考  官方手册的filter_var用法 。)
或者可以用下面的字符标识方式:
  1. I('post.email','','email');
复制代码
可以支持的过滤名称必须是filter_list方法中的有效值(不同的服务器环境可能有所不同),可能支持的包括:

    1. int
    2.  boolean
    3.  float
    4. validate_regexp
    5. validate_url
    6. validate_email
    7. validate_ip
    8.  string
    9. stripped
    10. encoded
    11. special_chars
    12. unsafe_raw
    13. email
    14. url
    15. number_int
    16. number_float
    17. magic_quotes
    18. callback

4. L方法:启用多语言的情况下,设置和获取当前的语言定义。

格式L('语言变量'[,'语言值'])

 L($name=null,$value=null)

@param string|array $name 语言变量
  @param mixed $value 语言值或者变量
  @return mixed
设置语言变量

除了使用语言包定义语言变量之外,我们可以用L方法动态设置语言变量,例如:

    1. L('LANG_VAR','语言定义');
复制代码
语言定义不区分大小写,所以下面也是等效的:
    1. L('lang_var','语言定义');
复制代码
不过规范起见,我们建议统一采用大写定义语言变量。
L方法支持批量设置语言变量,例如:
    1. $lang['lang_var1'] = '语言定义1';
    2. $lang['lang_var2'] = '语言定义2';
    3. $lang['lang_var3'] = '语言定义3';
    4. L($lang);//表示同时设置3个语言变量lang_var1 lang_var2和lang_var3。

获取语言变量
    1. $langVar = L('LANG_VAR');
    2. //$langVar = L('lang_var');//获取lang_var的语言值
    3. //$lang = L();//获取当前定义的全部语言变量(包括语言定义文件中的)
复制代码

复制代码
或者我们也可以在模板中使用
    1. {$Think.lang.lang_var}//来输出语言定义。
复制代码


5. N方法,计数器方法,

用于核心的查询、缓存统计的计数和统计。也可用于其他计数引用。

格式:N('计数位置'[,'步进值'])

N($key,$step=0,$save=false)

@param string $key 标识位置
@param integer $step 步进值
@return mixed

使用:

    1. N('read',1);//统计页面的查询次数,表示每次执行到该位置都会引起计数器加1
    2. //N('score',5);//计数器每次增加5
    3. $count = N('read');//来统计当前页面执行的查询数目。

注释:N方法页面执行完毕后的统计结果不会带入下次统计。

6. C方法,用于设置、获取、保存配置参数的方法

C方法的所有操作都是围绕配置相关的。(ThinkPHP的配置文件采用PHP数组格式定义)。配置参数不区分大小写,建议保持统一大写的配置定义规范。

格式:

C($name=null,$value=null,$default=null)
@param string|array $name 配置变量
@param mixed $value 配置值
@param mixed $default 默认值
@return mixed

设置参数:

    1. C('DB_NAME','thinkphp');//设置DB_NAME为thinkphp
    2. C('db_name','thinkphp');//同上
    3. C('USER.USER_ID',8);//支持二级配置参数的设置,不建议超过二级
    4. $config['user_id'] = 1;
    5. $config['user_type'] = 1;
    6. C($config);//批量设置,等同于以下设置
    7. //C('USER_ID',1);
    8. //C('USER_TYPE',1);

获取参数:

    1. $userId = C('USER_ID');//获取设置的参数,USER_ID参数尚未定义过,则返回NULL。
    2. $userType = C('USER_TYPE');//获取设置的参数
    3. $userId = C('USER.USER_ID');
    4. $config = C();//获取全部的参数
保存设置:

3.1版本增加了一个永久保存设置参数的功能,仅针对批量赋值的情况,例如:

    1. $config['user_id'] = 1;
    2. $config['user_type'] = 1;
    3. C($config,'name');//批量设置了config参数,连同当前所有的配置参数保存到缓存文件name中。

    4. $config = C('','name');//取回保存的参数,name就是前面保存参数时用的缓存的标识,必须一致才能正确取回保存的参数。取回的参数会和当前的配置参数合并,无需手动合并。


7. U方法

用于完成对URL地址的组装,特点在于可以自动根据当前的URL模式和设置生成对应的URL地址

格式U('地址','参数','伪静态','是否跳转','显示域名');

在模板中采用{:U('地址', '参数'…)} 的方式

U($url='',$vars='',$suffix=true,$domain=false)
  @param string $url URL表达式,格式:'[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...'
  @param string|array $vars 传入的参数,支持数组和字符串
  @param string $suffix 伪静态后缀,默认为true表示获取配置值
  @param boolean $domain 是否显示域名
  @return string

基本用法:

    1. U('User/add') // 生成User模块的add操作地址
    2. U('Home/User/add') // 生成Home分组的User模块的add操作地址
    3. U('add') // 生成当前访问模块的add操作地址
    4. U('Blog/read?id=1') // 生成Blog模块的read操作 并且id为1的URL地址
    5. //U方法的第二个参数支持传入参数,支持数组字符串两种定义方式,如果只是字符串方式的参数可以在第一个参数中定
    6. U('Blog/cate',array('cate_id'=>1,'status'=>1))//生成Blog模块cate操作,并且cate_id为1,status为1的URL
    7. //U('Blog/cate','cate_id=1&status=1')//同上
    8. //U('Blog/cate?cate_id=1&status=1')//同上

URL模式:

  • 普通模式: http://serverName/index.php?m=Blog&a=read&id=1
  • PATHINFO模式:http://serverName/index.php/Blog/read/id/1
设置PATHINFO分隔符
      1. 'URL_PATHINFO_DEPR'=>'_'

URL格式: http://serverName/Blog_read_id_1

  • REWRITE模式:  http://serverName/Blog/read/id/1

伪静态后缀为html后,URL格式:http://serverName/Blog/read/id/1.html

U方法里面可以指定要生成的伪静态后缀,示例:

    1. U('Blog/read','id=1','xml')

生成的url为:

    1. http://serverName/Blog/read/id/1.xml


路由支持:

U方法还可以支持路由,如果我们定义了一个路由规则为:

    1. 'news/:id\d'=>'News/read'
复制代码
那么可以使用
    1. U('/news/1')
复制代码
最终生成的URL地址是:
    1. http://serverName/index.php/news/1

域名支持

如果你的应用涉及到多个子域名的操作地址,可以在U方法里面指定需要生成地址的域名@后面传入需要指定的域名即可

示例:

    1. U('Blog/read@blog.thinkphp.cn','id=1');//域名为blog.thinkphp.cn

U方法的第5个参数如果设置为true,表示自动识别当前的域名,并且会自动根据子域名部署设置APP_SUB_DOMAIN_DEPLOY和APP_SUB_DOMAIN_RULES自动匹配生成当前地址的子域名。如果开启了URL_CASE_INSENSITIVE,则会统一生成小写的URL地址。

锚点支持:

3.1.2版本开始,U方法还可以支持生成URL地址中的锚点,例如:

    1. U('Blog/read#comment','id=1','html')
复制代码
就会生成
    1. http://serverName/Blog/read/id/1.html#comment
复制代码
如果域名和锚点同时使用的话,注意顺序为先锚点后域名,例如:
    1. U('Blog/read#comment@blog','id=1');

8. A方法,用于内部实例化控制器

格式:调用A('[项目://][分组/]模块','控制器层名称')

A($name,$layer='',$level='')

 @param string $name 资源地址
  @param string $layer 控制层名称
  @param integer $level 控制器层次
  @return Controller|false

用法:

    1. $User = A('User');//实例化当前项目的UserAction控制器,(对应的文件位于Lib/Action/UserAction.class.php)
    2. $User = A('Admin/User');//采用分组模式实例化UserAction控制器

支持跨项目的实例化(项目的目录要保持同级)

    1. $User = A('Admin://User');//实例化Admin项目下的UserAction控制器

3.11版本增加了支持分层控制器

    1. $User = A('User','Event);//实例化UserEvent控制器(对应的文件位于Lib/Event/UserEvent.class.php

注意:在跨项目调用的情况下,如果你的操作方法 有针对当前控制器的特殊变量操作,会有一些未知的问题,所以,一般来说,官方建议需要公共调用的控制器层单独开发,不要有太多的依赖关系。


9.D方法,实例化自定义模型类。

是ThinkPHP框架对Model类实例化的一种封装,并实现了单例模式,支持跨项目和分组调用

格式:

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

方法的返回值是实例化的模型对象。

D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化Model基类,同时对于已实例化过的模型,不会重复去实例化,可以减少一定的对象实例化开销。

D($name='',$layer='')

 @param string $name 资源地址
         @param string $layer 模型层名称
  @return Model

示例:

    1. $User = D('User');// 实例化User模型

会导入当前项目下面的Lib/Model/UserModel.class.php文件,然后实例化UserModel类,所以,以上的代码可能会等效与:

  1. import('@.Model.UserModel');
  2. $User = new UserModel();
但是,如果UserModel不存在,则:

  1. new Model('User');

D方法可以支持跨分组和项目实例化模型,例如:

  1. D('Admin://User');//实例化Admin项目的User模型
  2. D('Admin/User');//实例化Admin分组的User模型

注意:要实现跨项目调用模型的话,必须确保两个项目的目录结构是并列的。

3.1版本开始,由于增加了分层模型的支持,所以D方法也可以实例化其他的模型,例如:

    1. // 实例化UserService类
    2. $User = D('User','Service');
    3.  // 实例化UserLogic类
    4. $User = D('User','Logic');
复制代码

    1. D('User','Service');//会导入Lib/Service/UserService.class.php,并实例化,
    2. //等效于下面的代码:
    3. //import('@.Service.UserService');
    4. //$User = new UserSerivce();

10. M方法,实例化一个基础模型类

格式M('[基础模型名:]模型名','数据表前缀','数据库连接信息')、

M($name='',$tablePrefix='',$connection='')
   @param string $name Model名称 支持指定基础模型 例如MongoModel:User
 @param string $tablePrefix 表前缀
 @param mixed $connection 数据库连接信息
 @return Model

用法:

1、实例化基础模型(model)类

在没有定义任何模型的时候,可以使用下面方法实例化一个模型类曹进行操作:

    1. //实例化User模型
    2. $User = M('User');//等效于 $user=new Model("User");
    3.  //执行其他的数据操作
    4. $User->select();

这种方法是最简单高效的,不需要定义任何的模型类,所以支持跨项目调用。缺点是因为没有自定义的模型类,所以无法写入相关的业务逻辑,只能完成基本的CURD操作。(M方法的模型名参数在转换成数据表时会自动转换为小写)

2、实例化其他公共模型类

    1. $User = M('CommonModel:User');//等效于:$user=new CommonModel("User");

因为系统的模型类都能够自动加载,因此我们不需要在实例化之前手动进行类库导入操作。模型类CommonModel必须继承Model。我们可以在CommonModel类里面定义一些通用的逻辑方法,就可以省去为每个数据表定义具体的模型类,如果你的项目已经有超过100个数据表了,而大多数情况都是一些基本的CURD操作的话,只是个别模型有一些复杂的业务逻辑需要封装,那么第一种方式和第二种方式的结合是一个不错的选择。

3、传入表前缀、数据库和其他信息

M方法有三个参数,第一个参数是模型名称(可以包括基础模型类和数据库),第二个参数用于设置数据表的前缀(留空则取当前项目配置的表前缀),第三个参数用于设置当前使用的数据库连接信息(留空则取当前项目配置的数据库连接信息),例如:

    1. $User = M('db2.User','think_');//实例化UserModel类,并操作db2数据库中的think_user表。

第二个参数留空或者不传,表示使用当前项目配置中的数据库表前缀,示例:

    1. $User = M('db1.User',null);//实例化Model类型,并操作db1数据库中的User表

如果操作的数据需要不同的用户账户,可以传入数据库的连接信息,示例:

    1. $User = M('User','think_','mysql://user_a:1234@localhost:3306/thinkphp');//实例化Model类,操作数据库thinkphp中的表think_user,用user_a账户进行数据库连接
复制代码
第三个参数可以使用DSN配置或者数组配置,甚至可以支持配置参数。

在项目配置文件中设置:

      1. 'DB_CONFIG'=>'mysql://user_a:1234@localhost:3306/thinkphp';
可以使用
      1. $User = M('User','think_','DB_CONFIG');

示例:

    1. $User = M('CommonModel:db2.User','think_');//基础模型类和数据库可以一起使用:
    2. M('UserLogic:User');//实例化UserLogic(利用公共模型类的方式,实例化分层模型)
    3. D('User','Logic');//同上,实例化UserLogic

M和D方法的区别

都用于实例化一个模型类,M方法用于高效实例化一个基础模型类,D方法用于实例化一个用于自定义模型类。

1、不需要自定义模型类,减少IO加载,性能较好;

2、实例化后只能调用基础模型类(默认是Model类)中的方法;

3、可以在实例化的时候指定表前缀、数据库和数据库的连接信息;

D方法的强大则体现在你封装的自定义模型类有多强,不过随着新版ThinkPHP框架的基础模型类的功能越来越强大,M方法也比D方法越来越实用了。

使用M方法

如果是如下情况,请考虑使用 M方法:

  1. 对数据表进行简单的 CURD 操作而无复杂的业务逻辑时
  2. 只有个别的表有较为复杂的业务逻辑时,将 M方法 与实例化 CommonModel 类进行结合使用

M方法 甚至可以简单看着就是对参数表名对应的数据表的操作:

	$User = M('User'); 

使用D方法

如果是如下情况,请考虑使用 D方法:

  1. 需要使用 ThinkPHP 模型中一些高级功能如自动验证功能(create()方法中实现)、关联模型等
  2. 业务逻辑比较复杂,且涉及的表众多
  3. 将业务逻辑定义在了自定义的模型类里面(Lib/Model目录下),而想在操作中实现这些业务逻辑


11. R方法,调用某个控制器的操作方法,是A方法发进一步增强和补充

格式:R('[项目://][分组/]模块/操作','参数','控制器层名称') 

(一般R方法用于跨模块调用)

R($url,$vars=array(),$layer='')
 @param string $url 调用地址
 @param string|array $vars 调用参数 支持字符串和数组
 @param string $layer 要调用的控制层名称
 @return mixed

示例:

<span style="white-space:pre">	</span><?php
<span style="white-space:pre">	</span>class UserAction extends Action {
<span style="white-space:pre">	</span>    public function detail($id){
   <span style="white-space:pre">	</span>     return M('User')->find($id);
  <span style="white-space:pre">	</span>  }
 <span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>?>
  1. $data = R('User/detail',array('5'));//在其他控制器里调用User控制器中的detail方法。(detail方法必须是public类型)
  2. $data = R('User/detail');//需要调用的方法没有任何参数时,第二个参数可以不传
  3. $data =R('Admin/User/detail',array('5'));//跨分组和项目调用,调用Admin分组下面的UserAction中的detail方法

官方的建议是不要在同一层多太多调用,会引起逻辑的混乱,被公共调用的部分应该封装成单独的接口,可以借助3.1的新特性多层控制器,单独添加一个控制器层用于接口调用,例如,我们增加一个Api控制器层

<span style="white-space:pre">	</span><?php
<span style="white-space:pre">	</span>class UserApi extends Action {
<span style="white-space:pre">	</span>    public function detail($id){
<span style="white-space:pre">	</span>        return M('User')->find($id);
<span style="white-space:pre">	</span>    }
<span style="white-space:pre">	</span> }
<span style="white-space:pre">	</span>?>
然后,使用R方法调用
    1. $data = R('User/detail',array('5'),'Api');
也就是说,R方法的第三个参数支持指定调用的控制器层。
同时,R方法调用操作方法的时候可以支持操作后缀设置C('ACTION_SUFFIX'),如果你设置了操作方法后缀,仍然不需要更改R方法的调用方式。 :


12. W()渲染输出Widget

W($name,$data=array())
 @param string $name Widget名称
 @param array $data 传入的参数
 @return void


13. E() 抛出异常处理


E($msg, $code=0)
 @param string $msg 异常消息
 @param integer $code 异常代码 默认为0
 @return void

 @param string $msg 异常消息
 @param integer $code 异常代码 默认为0
 @return void


14. B() 执行某个行为

B($name,$tag='',&$params=NULL)
 @param string $name 行为名称
 @param string $tag 标签名称(行为类无需传入)
 @param Mixed $params 传入的参数
 @return void



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值