分享

ThinkPHP函数解析GUISF

 Be_The_Change 2013-12-15
G 函数:调试统计:
ThinkPHP长期以来需要通过debug_start、debug_end方法甚至Debug类才能完成的功能,3.1版本中被一个简单的G方法取代了,不可不谓是一次华丽升级。
G方法的作用包括标记位置和区间统计两个功能,下面来看下具体用法:

标记位置

G方法的第一个用法就是标记位置,例如:
  1. G('begin');
复制代码
表示把当前位置标记为begin标签,并且记录当前位置的执行时间,如果环境支持的话,还能记录内存占用情况。可以在任何位置调用G方法标记。

运行时间统计

标记位置后,我们就可以再次调用G方法进行区间统计了,例如:
  1. G('begin');
  2. // ...其他代码段
  3. G('end');
  4. // ...也许这里还有其他代码
  5. // 进行统计区间
  6. echo G('begin','end').'s';
复制代码
G('begin','end') 表示统计begin位置到end位置的执行时间(单位是秒),begin必须是一个已经标记过的位置,如果这个时候end位置还没被标记过,则会自动把当前位置标记为end标签,输出的结果类似于:
  1. 0.0056s
复制代码
默认的统计精度是小数点后4位,如果觉得这个统计精度不够,还可以设置例如:
  1. G('begin','end',6).'s';
复制代码
可能的输出会变成:
  1. 0.005587s
复制代码

内存开销统计

如果你的环境支持内存占用统计的话,还可以使用G方法进行区间内存开销统计(单位为kb),例如:
  1. echo G('begin','end','m').'kb';
复制代码
第三个参数使用m表示进行内存开销统计,输出的结果可能是:
  1. 625kb
复制代码
同样,如果end标签没有被标记的话,会自动把当前位置先标记位end标签。
如果环境不支持内存统计,则该参数无效,仍然会进行区间运行时间统计。

忘掉debug_start、debug_end吧,大道至简,你懂的~


U方法用于完成对URL地址的组装,特点在于可以自动根据当前的URL模式和设置生成对应的URL地址,格式为:
U('地址','参数','伪静态','是否跳转','显示域名');
在模板中使用U方法而不是固定写死URL地址的好处在于,一旦你的环境变化或者参数设置改变,你不需要更改模板中的任何代码。
在模板中的调用格式需要采用 {:U('地址', '参数'…)} 的方式

基本用法

U方法的用法示例:
  1. U('User/add') // 生成User模块的add操作地址
复制代码
也可以支持分组调用:
  1. U('Home/User/add') // 生成Home分组的User模块的add操作地址
复制代码
当然,也可以只是写操作名,表示调用当前模块的
  1. U('add') // 生成当前访问模块的add操作地址
复制代码
除了分组、模块和操作名之外,我们也可以传入一些参数:
  1. U('Blog/read?id=1') // 生成Blog模块的read操作 并且id为1的URL地址
复制代码
U方法的第二个参数支持传入参数,支持数组和字符串两种定义方式,如果只是字符串方式的参数可以在第一个参数中定义,下面几种方式都是等效的:
  1. U('Blog/cate',array('cate_id'=>1,'status'=>1))
  2. U('Blog/cate','cate_id=1&status=1')
  3. U('Blog/cate?cate_id=1&status=1')
复制代码
但是不允许使用下面的定义方式来传参数:
  1. U('Blog/cate/cate_id/1/status/1')
复制代码
根据项目的不同URL设置,同样的U方法调用可以智能地对应产生不同的URL地址效果,例如针对:
  1. U('Blog/read?id=1')
复制代码
这个定义为例。
如果当前URL设置为普通模式的话,最后生成的URL地址是:
  1. http://serverName/index.php?m=Blog&a=read&id=1
复制代码
如果当前URL设置为PATHINFO模式的话,同样的方法最后生成的URL地址是:
  1. http://serverName/index.php/Blog/read/id/1
复制代码
如果当前URL设置为REWRITE模式的话,同样的方法最后生成的URL地址是:
  1. http://serverName/Blog/read/id/1
复制代码
如果你同时还设置了PATHINFO分隔符的话:
  1. 'URL_PATHINFO_DEPR'=>'_'
复制代码
就会生成
  1. http://serverName/Blog_read_id_1
复制代码
如果当前URL设置为REWRITE模式,并且设置了伪静态后缀为html的话,同样的方法最后生成的URL地址是:
  1. http://serverName/Blog/read/id/1.html
复制代码
如果设置了多个伪静态支持,那么会自动取第一个伪静态后缀添加到URL地址后面,当然你也可以手动在U方法里面指定要生成的伪静态后缀,例如:
  1. U('Blog/read','id=1','xml')
复制代码
就会生成
  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.','id=1');
复制代码
@后面传入需要指定的域名即可。

此外,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'); 

ThinkPHP的I方法是3.1.3版本新增的,如果你是之前的3.*版本的话,可以直接参考使用3.1快速入门教程系列的变量部分

概述

正如你所见到的一样,I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:
I('变量类型.变量名',['默认值'],['过滤方法'])
变量类型是指请求方式或者输入类型,包括:
变量类型含义
get获取GET参数
post获取POST参数
param自动判断请求类型获取GET、POST或者PUT参数
request获取REQUEST 参数
put获取PUT 参数
session获取 $_SESSION 参数
cookie获取 $_COOKIE 参数
server获取 $_SERVER 参数
globals获取 $GLOBALS参数
注意:变量类型不区分大小写。
变量名则严格区分大小写。
默认值和过滤方法均属于可选参数。

用法

我们以GET变量类型为例,说明下I方法的使用:
  1. echo I('get.id'); // 相当于 $_GET['id']
  2. echo I('get.name'); // 相当于 $_GET['name']
复制代码
支持默认值:
  1. echo I('get.id',0); // 如果不存在$_GET['id'] 则返回0
  2. echo I('get.name',''); // 如果不存在$_GET['name'] 则返回空字符串
复制代码
采用方法过滤:
  1. echo I('get.name','','htmlspecialchars'); // 采用htmlspecialchars方法对$_GET['name'] 进行过滤,如果不存在则返回空字符串
复制代码
支持直接获取整个变量类型,例如:
  1. I('get.'); // 获取整个$_GET 数组
复制代码
用同样的方式,我们可以获取post或者其他输入类型的变量,例如:
  1. I('post.name','','htmlspecialchars'); // 采用htmlspecialchars方法对$_POST['name'] 进行过滤,如果不存在则返回空字符串
  2. I('session.user_id',0); // 获取$_SESSION['user_id'] 如果不存在则默认为0
  3. I('cookie.'); // 获取整个 $_COOKIE 数组
  4. I('server.REQUEST_METHOD'); // 获取 $_SERVER['REQUEST_METHOD'] 
复制代码
param变量类型是框架特有的支持自动判断当前请求类型的变量获取方式,例如:
  1. echo I('param.id'); 
复制代码
如果当前请求类型是GET,那么等效于 $_GET['id'],如果当前请求类型是POST或者PUT,那么相当于获取 $_POST['id'] 或者 PUT参数id。
并且param类型变量还可以用数字索引的方式获取URL参数(必须是PATHINFO模式参数有效,无论是GET还是POST方式都有效),例如:
当前访问URL地址是
  1. http://serverName/index.php/New/2013/06/01 
复制代码
那么我们可以通过
  1. echo I('param.1'); // 输出2013
  2. echo I('param.2'); // 输出06
  3. echo I('param.3'); // 输出01
复制代码
事实上,param变量类型的写法可以简化为:
  1. I('id'); // 等同于 I('param.id')
  2. I('name'); // 等同于 I('param.name')
复制代码

变量过滤

使用I方法的时候 变量其实经过了两道过滤,首先是全局的过滤,全局过滤是通过配置VAR_FILTERS参数,这里一定要注意,3.1版本之后,VAR_FILTERS参数的过滤机制已经更改为采用array_walk_recursive方法递归过滤了,主要对过滤方法的要求是必须引用返回,所以这里设置htmlspecialchars是无效的,你可以自定义一个方法,例如:
  1. function filter_default(&$value){
  2.     $value = htmlspecialchars($value);
  3. }
复制代码
然后配置:
  1. 'VAR_FILTERS'=>'filter_default'
复制代码
如果需要进行多次过滤,可以用:
  1. 'VAR_FILTERS'=>'filter_default,filter_exp'
复制代码
filter_exp方法是框架内置的安全过滤方法,用于防止利用模型的EXP功能进行注入攻击。

因为VAR_FILTERS参数设置的是全局过滤机制,而且采用的是递归过滤,对效率有所影响,所以,我们更建议直接对获取变量过滤的方式,除了在I方法的第三个参数设置过滤方法外,还可以采用配置DEFAULT_FILTER参数的方式设置过滤,事实上,该参数的默认设置是:
  1. 'DEFAULT_FILTER'        => 'htmlspecialchars'
复制代码
也就说,I方法的所有获取变量都会进行htmlspecialchars过滤,那么:
  1. I('get.name'); // 等同于 htmlspecialchars($_GET['name'])
复制代码
同样,该参数也可以支持多个过滤,例如:
  1. 'DEFAULT_FILTER'        => 'strip_tags,htmlspecialchars'
复制代码
  1. I('get.name'); // 等同于 htmlspecialchars(strip_tags($_GET['name']))
复制代码
如果我们在使用I方法的时候 指定了过滤方法,那么就会忽略DEFAULT_FILTER的设置,例如:
  1. echo I('get.name','','strip_tags'); // 等同于 strip_tags($_GET['name'])
复制代码
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
复制代码
在有些特殊的情况下,我们不希望进行任何过滤,即使DEFAULT_FILTER已经有所设置,可以使用:
  1. I('get.name','',NULL);
复制代码
一旦过滤参数设置为NULL,即表示不再进行任何的过滤。

cache方法是3.0版本开始新增的缓存管理方法。
注意:3.1.2版本后因cache方法并入原S方法,所以cache方法不再建议使用,用S方法即可。
cache 用于缓存设置、获取、删除操作
用法cache($name, $value='',$options=null)
参数name(必须):如果传入数组 则表示进行缓存初始化,如果是字符串则表示缓存赋值、获取或者删除操作。
Value(可选):要设置的缓存值,如果传入null表示删除缓存,默认为空字符串。
options(可选):要设置的缓存参数,如果是数字则表示仅设置有效期
返回值见详(根据具体的用法返回不同的值)

缓存初始化

cache方法传入数组即表示进行缓存初始化,例如:
  1. cache(array('type'=>'xcache','prefix'=>'think','expire'=>600));
复制代码
支持的配置参数根据不同的缓存方式(由type参数设置),通用的缓存参数包括:
参数名说明
expire缓存有效期(时间为秒)
length缓存队列长度
prefix缓存标识前缀
type缓存类型
如果没有设置type参数,则默认为文件缓存,cache方法目前可以支持的缓存类型包括File、Apachenote、Apc、Eaccelerator、Memcache、Shmop、Sqlite、Db、Redis、Xcache和WinCache,不同缓存类型的缓存参数可以参考这里:动态缓存
缓存初始化操作后返回的是一个缓存实例化对象。
如果你没有进行缓存初始化的话,cache方法会在你进行缓存操作之前自动初始化(用系统默认的缓存方式和缓存参数),默认缓存配置参数包括:
  1. /* 数据缓存设置 */
  2. 'DATA_CACHE_TIME'       => 0,      // 数据缓存有效期 0表示永久缓存
  3. 'DATA_CACHE_COMPRESS'   => false,   // 数据缓存是否压缩缓存
  4. 'DATA_CACHE_CHECK'      => false,   // 数据缓存是否校验缓存
  5. 'DATA_CACHE_PREFIX'     => '',     // 缓存前缀
  6. 'DATA_CACHE_TYPE'       => 'File',  // 数据缓存类型
  7. 'DATA_CACHE_PATH'       => TEMP_PATH,// 缓存路径设置 (仅对File方式有效)
  8. 'DATA_CACHE_SUBDIR'     => false,  // 使用子目录缓存 (根据缓存标识的哈希创建子目录)
  9. 'DATA_PATH_LEVEL'       => 1,        // 子目录缓存级别
复制代码
这些具体的缓存参数的用法,我们以后会在快速入门:缓存中详细描述。

缓存设置

缓存初始化之后,就可以进行缓存操作了,
  1. cache('name','value');
复制代码
会使用当前配置的缓存方式用name标识来缓存value值。
可以单独设置该缓存数据的有效期,例如:
  1. cache('name','value',3600);
复制代码
缓存数据一个小时。
为了保证缓存的安全,建议对返回值做出判断,如果缓存设置失败,则返回false,否则返回true。
3.1.2版本开始也可以直接在设置缓存的同时传入缓存设置参数,例如:
  1. cache('name','value',array('type'=>'xcache','prefix'=>'think','expire'=>600));
复制代码

获取缓存

  1. $value = cache('name');
复制代码
如果缓存标识不存在或者已经过期,则返回false,否则返回缓存值。

删除缓存

  1. cache('name',NULL);
复制代码
删除缓存标识为name的缓存数据。


如果要切换缓存方式,可以再次进行缓存初始化操作。
或者使用下面的方式:
  1. $cache = cache(array('type'=>'xcache','prefix'=>'think','expire'=>600));
  2. $cache->name = 'value'; // 设置缓存
  3. $value = $cache->name; // 获取缓存
  4. unset($cache->name); // 删除缓存
复制代码
如果你设置了缓存前缀的话,对应的缓存操作只是对应该缓存前缀标识的,不会影响其他的缓存。

 我们已经了解了ThinkPHP中的S方法的用法,F方法其实是S方法的一个子集功能,仅用于简单数据缓存,并且只能支持文件形式,不支持缓存有效期,因为采用的是PHP返回方式,所以其效率较S方法较高,因此我们也称之为快速缓存方法。
F方法的特点是:
简单数据缓存;
文件形式保存;
采用PHP返回数据方式加载缓存;
支持子目录缓存以及自动创建;
支持删除缓存和批量删除;

写入和读取缓存

  1. F('data','test data');
复制代码
默认的保存起始路径是DATA_PATH(该常量在默认配置位于RUNTIME_PATH.'Data/'下面),也就是说会生成文件名为DATA_PATH.'data.php'的缓存文件。
注意:确保你的缓存标识的唯一,避免数据覆盖和冲突。
下次读取缓存数据的时候,使用:
  1. $Data = F('data');
复制代码
我们可以采用子目录方式保存,例如:
  1. F('user/data',$data); // 缓存写入
  2. F('user/data'); // 读取缓存
复制代码
就会生成DATA_PATH.'user/data.php' 缓存文件,如果user子目录不存在的话,则会自动创建,也可以支持多级子目录,例如:
  1. F('level1/level2/data',$data);
复制代码
如果需要指定缓存的起始目录,可以用下面的方式:
  1. F('data',$data,TEMP_PATH);
复制代码
获取的时候则需要使用:
  1. F('data','',TEMP_PATH);
复制代码

删除缓存

删除缓存也很简单,使用:
  1. F('data',NULL); 
复制代码
第二个参数传入NULL,则表示删除标识为data的数据缓存。
支持批量删除功能,尤其是针对子目录缓存的情况,假设我们要删除user子目录下面的所有缓存数据,可以使用:
  1. F('user/*',NULL);
复制代码
又或者使用过滤条件删除,例如:
  1. F('user/[^a]*',NULL);
复制代码

复制代码


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多