概述
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方式缓存。可以在项目配置文件里面修改:
- 'DATA_CACHE_TYPE'=>'Xcache';//设置为默认缓存方式为Xcache(环境需要支持Xcache)
- 'DATA_CACHE_SUBDIR'=>TRUE; //启用哈希子目录缓存的方式
- 'DATA_PATH_LEVEL'=>2; //设置哈希目录的层次,根据缓存标识的哈希自动创建多层子目录来缓存
也可以在S方法里面显示指定缓存方式,如:
- S('data',$Data,3600,'File');
使用方法:
- cache(array('type'=>'xcache','expire'=>60));//1 缓存初始化
- cache('a',$value);//2 缓存设置
- $value = cache('a');//3 缓存读取
- cache('a',null);//4 缓存删除
需要使用不同的缓存方式的时候 需要重新初始化,如果不初始化直接调用的话,则会按照系统配置自动初始化。
初始化的返回值,可以直接操作缓存:
- $cache = cache(array('type'=>'xcache','expire'=>60));
- $cache->set('name',$value);
- $cache->get('name');
- $cache->rm('name');
或者
- $cache = cache(array('type'=>'xcache','expire'=>60));
- $cache->name = $value;
- echo $cache->name;
- 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/'下面)目录下面
注意:确保你的缓存标识的唯一,避免数据覆盖和冲突。
- F('data',$Data);//写入缓存
快速缓存Data数据,保存到指定的目录
- F('data',$Data,TEMP_PATH); //写入指定目录的缓存
- F('data','',TEMP_PATH);//获取指定目录下的缓存
获取缓存数据
- $Data = F('data');
删除缓存数据
- F('data',NULL); //第二个参数传入NULL,则表示删除标识为data的数据缓存。
- F('user/*',NULL);//批量删除,要删除user子目录下面的所有缓存数据
- F('user/[^a]*',NULL);//使用过滤条件删除
F方法支持自动创建缓存子目录,例如:在DATA_PATH目录下面缓存data数据,如果User子目录不存在,则自动创建(支持子目录缓存以及自动创建)
- 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参数
注意:变量类型不区分大小写。
变量名则严格区分大小写。
默认值和过滤方法均属于可选参数。
使用方法:
- echo I('get.id'); // 相当于 $_GET['id']
- echo I('get.name'); // 相当于 $_GET['name']
- echo I('get.id',0); // 如果不存在$_GET['id'] 则默认返回0
- echo I('get.name',''); // 如果不存在$_GET['name'] 则返回空字符串
- echo I('get.name','','htmlspecialchars');//采用htmlspecialchars方法对$_GET['name'] 进行过滤,如果不存在则返回空字符串
- I('get.'); // 获取整个$_GET 数组
- I('post.name','','htmlspecialchars'); // 采用htmlspecialchars方法对$_POST['name'] 进行过滤,如果不存在则返回空字符串
- I('session.user_id',0); // 获取$_SESSION['user_id'] 如果不存在则默认为0
- I('cookie.'); // 获取整个 $_COOKIE 数组
- I('server.REQUEST_METHOD'); // 获取 $_SERVER['REQUEST_METHOD']
- echo I('param.id'); //自动判断当前请求类型的变量
变量过滤:
I方法的时候 变量其实经过了两道过滤,首先是全局的过滤,全局过滤是通过配置VAR_FILTERS参数。3.1版本之后,VAR_FILTERS参数的过滤机制已经更改为采用array_walk_recursive方法递归过滤了,主要对过滤方法的要求是必须引用返回,所以这里设置htmlspecialchars是无效的,你可以自定义一个方法,例如:
- function filter_default(&$value){
- $value = htmlspecialchars($value);
- }
VAR_FILTERS参数设置的是全局过滤机制,而且采用的是递归过滤,对效率有所影响,所以,我们更建议直接对获取变量过滤的方式,除了在I方法的第三个参数设置过滤方法外,还可以采用配置DEFAULT_FILTER参数的方式设置过滤
- 'VAR_FILTERS'=>'filter_default'
- //'VAR_FILTERS'=>'filter_default,filter_exp'//需要进行多次过滤,filter_exp方法是框架内置的安全过滤方法,用于防止利用模型的EXP功能进行注入攻击。
- 'DEFAULT_FILTER'=>'htmlspecialchars'//I方法的所有获取变量都会进行htmlspecialchars过滤
- //'DEFAULT_FILTER' => 'strip_tags,htmlspecialchars'//指定多个过滤方法
示例:
- I('get.name'); // 等同于 htmlspecialchars($_GET['name'])
- I('get.name','','strip_tags'); // 等同于 strip_tags($_GET['name']),指定了过滤方法以后就忽略DEFAULT_FILTER的设置
- I('get.name','',NULL);//表示不再进行任何的过滤。
- I('post.email','',FILTER_VALIDATE_EMAIL);//对$_POST['email'] 进行 格式验证,如果不符合要求的话,返回空字符串。
或者可以用下面的字符标识方式:
- I('post.email','','email');
- int
- boolean
- float
- validate_regexp
- validate_url
- validate_email
- validate_ip
- string
- stripped
- encoded
- special_chars
- unsafe_raw
- url
- number_int
- number_float
- magic_quotes
- callback
4. L方法:启用多语言的情况下,设置和获取当前的语言定义。
格式:L('语言变量'[,'语言值'])
L($name=null,$value=null)
@param string|array $name 语言变量
@param mixed $value 语言值或者变量
@return mixed
设置语言变量
除了使用语言包定义语言变量之外,我们可以用L方法动态设置语言变量,例如:
- L('LANG_VAR','语言定义');
- L('lang_var','语言定义');
L方法支持批量设置语言变量,例如:
- $lang['lang_var1'] = '语言定义1';
- $lang['lang_var2'] = '语言定义2';
- $lang['lang_var3'] = '语言定义3';
- L($lang);//表示同时设置3个语言变量lang_var1 lang_var2和lang_var3。
- $langVar = L('LANG_VAR');
- //$langVar = L('lang_var');//获取lang_var的语言值
- //$lang = L();//获取当前定义的全部语言变量(包括语言定义文件中的)
- {$Think.lang.lang_var}//来输出语言定义。
5. N方法,计数器方法,
用于核心的查询、缓存统计的计数和统计。也可用于其他计数引用。
格式:N('计数位置'[,'步进值'])
N($key,$step=0,$save=false)
@param string $key 标识位置
@param integer $step 步进值
@return mixed
使用:
- N('read',1);//统计页面的查询次数,表示每次执行到该位置都会引起计数器加1
- //N('score',5);//计数器每次增加5
- $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
设置参数:
- C('DB_NAME','thinkphp');//设置DB_NAME为thinkphp
- C('db_name','thinkphp');//同上
- C('USER.USER_ID',8);//支持二级配置参数的设置,不建议超过二级
- $config['user_id'] = 1;
- $config['user_type'] = 1;
- C($config);//批量设置,等同于以下设置
- //C('USER_ID',1);
- //C('USER_TYPE',1);
获取参数:
- $userId = C('USER_ID');//获取设置的参数,USER_ID参数尚未定义过,则返回NULL。
- $userType = C('USER_TYPE');//获取设置的参数
- $userId = C('USER.USER_ID');
- $config = C();//获取全部的参数
3.1版本增加了一个永久保存设置参数的功能,仅针对批量赋值的情况,例如:
- $config['user_id'] = 1;
- $config['user_type'] = 1;
- C($config,'name');//批量设置了config参数,连同当前所有的配置参数保存到缓存文件name中。
-
- $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
基本用法:
- U('User/add') // 生成User模块的add操作地址
- U('Home/User/add') // 生成Home分组的User模块的add操作地址
- U('add') // 生成当前访问模块的add操作地址
- U('Blog/read?id=1') // 生成Blog模块的read操作 并且id为1的URL地址
- //U方法的第二个参数支持传入参数,支持数组和字符串两种定义方式,如果只是字符串方式的参数可以在第一个参数中定
- U('Blog/cate',array('cate_id'=>1,'status'=>1))//生成Blog模块cate操作,并且cate_id为1,status为1的URL
- //U('Blog/cate','cate_id=1&status=1')//同上
- //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
- '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方法里面可以指定要生成的伪静态后缀,示例:
- U('Blog/read','id=1','xml')
生成的url为:
- http://serverName/Blog/read/id/1.xml
U方法还可以支持路由,如果我们定义了一个路由规则为:
- 'news/:idd'=>'News/read'
- U('/news/1')
- http://serverName/index.php/news/1
域名支持:
如果你的应用涉及到多个子域名的操作地址,可以在U方法里面指定需要生成地址的域名,@后面传入需要指定的域名即可。
示例:
- 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地址中的锚点,例如:
- U('Blog/read#comment','id=1','html')
- http://serverName/Blog/read/id/1.html#comment
- 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
用法:
- $User = A('User');//实例化当前项目的UserAction控制器,(对应的文件位于Lib/Action/UserAction.class.php)
- $User = A('Admin/User');//采用分组模式实例化UserAction控制器
支持跨项目的实例化(项目的目录要保持同级)
- $User = A('Admin://User');//实例化Admin项目下的UserAction控制器
3.11版本增加了支持分层控制器
- $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
示例:
- $User = D('User');// 实例化User模型
会导入当前项目下面的Lib/Model/UserModel.class.php文件,然后实例化UserModel类,所以,以上的代码可能会等效与:
- import('@.Model.UserModel');
- $User = new UserModel();
- new Model('User');
D方法可以支持跨分组和项目实例化模型,例如:
- D('Admin://User');//实例化Admin项目的User模型
- D('Admin/User');//实例化Admin分组的User模型
注意:要实现跨项目调用模型的话,必须确保两个项目的目录结构是并列的。
3.1版本开始,由于增加了分层模型的支持,所以D方法也可以实例化其他的模型,例如:
- // 实例化UserService类
- $User = D('User','Service');
- // 实例化UserLogic类
- $User = D('User','Logic');
- D('User','Service');//会导入Lib/Service/UserService.class.php,并实例化,
- //等效于下面的代码:
- //import('@.Service.UserService');
- //$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)类
在没有定义任何模型的时候,可以使用下面方法实例化一个模型类曹进行操作:
- //实例化User模型
- $User = M('User');//等效于 $user=new Model("User");
- //执行其他的数据操作
- $User->select();
这种方法是最简单高效的,不需要定义任何的模型类,所以支持跨项目调用。缺点是因为没有自定义的模型类,所以无法写入相关的业务逻辑,只能完成基本的CURD操作。(M方法的模型名参数在转换成数据表时会自动转换为小写)
2、实例化其他公共模型类
- $User = M('CommonModel:User');//等效于:$user=new CommonModel("User");
因为系统的模型类都能够自动加载,因此我们不需要在实例化之前手动进行类库导入操作。模型类CommonModel必须继承Model。我们可以在CommonModel类里面定义一些通用的逻辑方法,就可以省去为每个数据表定义具体的模型类,如果你的项目已经有超过100个数据表了,而大多数情况都是一些基本的CURD操作的话,只是个别模型有一些复杂的业务逻辑需要封装,那么第一种方式和第二种方式的结合是一个不错的选择。
3、传入表前缀、数据库和其他信息
M方法有三个参数,第一个参数是模型名称(可以包括基础模型类和数据库),第二个参数用于设置数据表的前缀(留空则取当前项目配置的表前缀),第三个参数用于设置当前使用的数据库连接信息(留空则取当前项目配置的数据库连接信息),例如:
- $User = M('db2.User','think_');//实例化UserModel类,并操作db2数据库中的think_user表。
第二个参数留空或者不传,表示使用当前项目配置中的数据库表前缀,示例:
- $User = M('db1.User',null);//实例化Model类型,并操作db1数据库中的User表
如果操作的数据需要不同的用户账户,可以传入数据库的连接信息,示例:
- $User = M('User','think_','mysql://user_a:1234@localhost:3306/thinkphp');//实例化Model类,操作数据库thinkphp中的表think_user,用user_a账户进行数据库连接
在项目配置文件中设置:
- 'DB_CONFIG'=>'mysql://user_a:1234@localhost:3306/thinkphp';
- $User = M('User','think_','DB_CONFIG');
示例:
- $User = M('CommonModel:db2.User','think_');//基础模型类和数据库可以一起使用:
- M('UserLogic:User');//实例化UserLogic(利用公共模型类的方式,实例化分层模型)
- D('User','Logic');//同上,实例化UserLogic
M和D方法的区别:
都用于实例化一个模型类,M方法用于高效实例化一个基础模型类,D方法用于实例化一个用于自定义模型类。
1、不需要自定义模型类,减少IO加载,性能较好;
2、实例化后只能调用基础模型类(默认是Model类)中的方法;
3、可以在实例化的时候指定表前缀、数据库和数据库的连接信息;
D方法的强大则体现在你封装的自定义模型类有多强,不过随着新版ThinkPHP框架的基础模型类的功能越来越强大,M方法也比D方法越来越实用了。
使用M方法
如果是如下情况,请考虑使用 M方法:
- 对数据表进行简单的 CURD 操作而无复杂的业务逻辑时
- 只有个别的表有较为复杂的业务逻辑时,将 M方法 与实例化 CommonModel 类进行结合使用
M方法 甚至可以简单看着就是对参数表名对应的数据表的操作:
$User = M('User');
使用D方法
如果是如下情况,请考虑使用 D方法:
- 需要使用 ThinkPHP 模型中一些高级功能如自动验证功能(create()方法中实现)、关联模型等
- 业务逻辑比较复杂,且涉及的表众多
- 将业务逻辑定义在了自定义的模型类里面(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>?>
- $data = R('User/detail',array('5'));//在其他控制器里调用User控制器中的detail方法。(detail方法必须是public类型)
- $data = R('User/detail');//需要调用的方法没有任何参数时,第二个参数可以不传
- $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方法调用
- $data = R('User/detail',array('5'),'Api');
同时,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
最后
以上就是心灵美睫毛为你收集整理的ThinkPHP函数方法总结的全部内容,希望文章能够帮你解决ThinkPHP函数方法总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复