【教训】null == '',改造ThinkSNS 系统里面的一个缓存管理函数S()后,留下一个大bug
2016-07-16 11:06
501 查看
本来想简化 ThinkSNS 系统里面的一个缓存管理函数:
简化如下:
结果呢,留下了一个大bug,想通过 S('键名', null); 来删除某个缓存,死活不成功!
通过跟踪,原来 当 $value = null 时,if ($value == '') 匹配成功,弱类型转换,即 null == '',所以需要把“等号”改为“恒等号”。即,把 if ($value == '') 改为 if ($value === ''),问题解决。
<?php /** * 用来对应用缓存信息的读、写、删除 * $expire = null/0 表示永久缓存,否则为缓存有效期 */ function S($name, $value = '', $expire = null) { static $_cache = array(); //减少缓存读取 $cache = model('Cache'); //$name = C('DATA_CACHE_PREFIX').$name; if ('' !== $value) { if (is_null($value)) { // 删除缓存 $result = $cache->rm($name); if ($result) { unset($_cache[$name]); } return $result; } else { // 缓存数据 $cache->set($name, $value, $expire); $_cache[$name] = $value; } return true; } if (isset($_cache[$name])) { return $_cache[$name]; } // 获取缓存数据 $value = $cache->get($name); $_cache[$name] = $value; return $value; }
简化如下:
/** * 内存缓存 * * @param string $name 缓存键 * @param string $value 缓存值(为''时,表示获取; 为null表示删除) * @param mixed $expire = null/0 表示永久缓存,否则为缓存有效期 */ function S($name, $value = '', $expire = null) { $cache = model('Cache'); if ($value == '') // 获取缓存 { return $cache->get($name); } elseif (is_null($value)) // 删除缓存 { return $cache->rm($name); } else { return $cache->set($name, $value, $expire); } }
结果呢,留下了一个大bug,想通过 S('键名', null); 来删除某个缓存,死活不成功!
通过跟踪,原来 当 $value = null 时,if ($value == '') 匹配成功,弱类型转换,即 null == '',所以需要把“等号”改为“恒等号”。即,把 if ($value == '') 改为 if ($value === ''),问题解决。
/** * 内存缓存 * * @param string $name 缓存键 * @param string $value 缓存值(为''时,表示获取; 为null表示删除) * @param mixed $expire = null/0 表示永久缓存,否则为缓存有效期 */ function S($name, $value = '', $expire = null) { $cache = model('Cache'); if ($value === '') // 获取缓存 { return $cache->get($name); } elseif (is_null($value)) // 删除缓存 { return $cache->rm($name); } else { return $cache->set($name, $value, $expire); } }
相关文章推荐
- 菜鸟必看css学习小技巧怎么实现三角形
- 树(5)二叉树层次遍历的应用
- 关于浏览器兼容性的博客锦集
- 线程共享方式
- jsp+sclipse+tomcat
- 简单导航
- C语言double和float 实例分析
- POJ 2752 Seek the Name, Seek the Fame
- 摄像头拍照,PHP输入流php://input的使用分析
- C#动态调用WCF接口(2)
- Android开发工具下载网站
- 常量与变量以及在内存中存储形式
- Web基础之httpd服务搭建(一)
- 翻页功能测用例设计
- 做10年Windows程序员与做10年Linux程序员的区别
- hdu 1667 The Rotation Game(2004 Asia Regional Shanghai)
- Summer day 5
- POJ_2488: A Knight's Journey
- c#之回车登录
- 给CentOS6.3 + PHP5.3 安装PHP性能测试工具 XHProf-0.9.2