不灭的焱

革命尚未成功,同志仍须努力

作者:php-note.com  发布于:2014-10-22 15:35  分类:PHP库/系统/微信  编辑

本来想简化 ThinkSNS 系统里面的一个缓存管理函数:

<?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);
	}
}