<转>也说一下ThinkPHP的Cookie函数
今天使用ThinkPHP的Cookie,遇到一些问题。现在虽然已经解决,但是也通过这件事情发现了几个问题,和大家分享一下。
TP的Cookie类位置是:Think\Lib\Think\Util\Cookie.class.php
1、关于Clear方法这个是最早遇到的,写了一个Logout动作,结果发现Clear完全无效。进入文件一看,TP对于clear方法是这样定义的:
- static function clear() {
- unset($_COOKIE);
- }
我在自己的程序里面直接测试 unset($_COOKIE); ,发现php本身根本不支持这个操作,操作没任何反应。仔细一想也是,$_COOKIE函数本身是系统定义的,没那么简单就能直接删除吧?
建议这个方法能够重写一下,比如做个遍历什么的,都可以解决这个问题。
2、关于cookie的存储方式。
用set方法存了登录的用户名到$_COOKIE['username'],结果在模板里用$Think.cookie.username读出来却是一段密文,看了代码,原来TP的set函数和get函数是这样写的:
- static function get($name) {
- $value = $_COOKIE[C('COOKIE_PREFIX').$name];
- $value = unserialize(base64_decode($value));
- return $value;
- }
-
- // 设置某个Cookie值
- static function set($name,$value,$expire='',$path='',$domain='') {
- if($expire=='') {
- $expire = C('COOKIE_EXPIRE');
- }
- if(empty($path)) {
- $path = C('COOKIE_PATH');
- }
- if(empty($domain)) {
- $domain = C('COOKIE_DOMAIN');
- }
- $expire = !empty($expire)? time()+$expire : 0;
- $value = base64_encode(serialize($value));
- setcookie(C('COOKIE_PREFIX').$name, $value,$expire,$path,$domain);
- $_COOKIE[C('COOKIE_PREFIX').$name] = $value;
- }
也
就是说,TP存储的Cookie值实际上已经经过了base64_encode()和serialize()两个函数的处理,这样做的好处显而易见,使得
Cookie可以储存数组,变得更强大,get方法在读取的时候进行了反处理,当然没什么问题,但是当要在模板中输出Cookie信息的时候就出问题了,
可能是TP忽略了模板输出Cookie的问题,希望能够修正一下。
现在我暂时的办法是自己在Set和Get方法中自己加了一个开关,设置不进行加密(因为我现在存储的都是简单字符串而已)。
3、关于Cookie操作的另外一个方法
使用的过程中,发现实际上TP除了Cookie类之外还有一个更方便的操作Cookie的方法,就是使用cookie函数,这些函数放在
\Think\Common\functions.php
中,简单看了一下,好像还不错,而且对于clear方法是采用了遍历的方式,较好地解决了上面的问题,时间关系没有详细试用。
4、关于代码写法的疑问
有朋友提到,关于Cookie::delete()函数无效的,说找到Cookie类的57行代码:
- Cookie::set($name,'',time()-3600)
去掉time()就正常了。
其实这个很好理解,不管是time()-3600还是-3600都是已经过去的时间,所以都可以起到删除该Cookie的作用,我看了functions.php里面的cookie函数也多次采用了类似的写法。
但是我隐约记得,php的代码规范里面,一个函数的参数中一般是不允许直接调用另外一个函数的,我之前自己写代码也遇到类似的问题,也是把函数移出来拿到
返回值再传递到外层函数的。具体的规范在哪里我现在说不上了,但是看来这种写法并不是很保险,也是建议TP能够确认和验证一下。
posted on 2015-11-22 19:05 hahahahahai12 阅读(920) 评论(0) 收藏 举报
浙公网安备 33010602011771号