2009八月11
php 结合COOKIE操作的队列类
队列是一种数据格式,你可以理解为有四个格子,你依次放进去红色小球,绿色小球,蓝色小球,粉色小球,这时候如果再想放进去一个,就只能取出一个,且肯定是把最先进来的(红色小球)拿出。其实就是一个先进先出的规则。最先弄进来的肯定最先出去。应用场景可以有很多,举个例子:我要记住用户最近干过的事情,并且这个记录是有上限的。那么我们就可以把用户的真实操作放在cookie里面,然后来展示就行了。当然为了符合客观事实,我们需要用到队列。
class QueueSvc
{/*{{{*/
private $length; // 队列的长度
private $server_arr;
public function __construct($length,$server_arr)
{
$this->length = $length;
$this->server_arr = $server_arr;
}
public function getServerArr()
{
return $this->server_arr;
}
public function set($server_name)
{
self::push($server_name);
}
private function push($server_name)
{
//有重复的记录,把重复的删掉
if(self::isServerExist($server_name)){
self::removeRepeat($server_name);
}else{
if(self::isFull()){
//如果已经满了,要把队列最后一个记录删掉
array_pop($this->server_arr);
}
}
//如果队列为空,先置为空数组
if(empty($this->server_arr))
$this->server_arr = array();
//向队列头添加数据
array_unshift($this->server_arr,$server_name);
}
private function isFull()
{
if(is_array($this->server_arr) && (count($this->server_arr) >= $this->length))
return true;
return false;
}
private function isServerExist($server_name)
{
if(is_array($this->server_arr) && in_array($server_name,$this->server_arr))
return true;
return false;
}
private function removeRepeat($server_name)
{
if(is_array($this->server_arr) && in_array($server_name,$this->server_arr))
{
foreach($this->server_arr as $key=>$value)
{
if($server_name == $value)
{
$this->array_remove($this->server_arr,$key);
}
}
}
}
private function array_remove(&$arr, $offset) {
array_splice ( $arr, $offset, 1 );
}
}/*}}}*/
{/*{{{*/
private $length; // 队列的长度
private $server_arr;
public function __construct($length,$server_arr)
{
$this->length = $length;
$this->server_arr = $server_arr;
}
public function getServerArr()
{
return $this->server_arr;
}
public function set($server_name)
{
self::push($server_name);
}
private function push($server_name)
{
//有重复的记录,把重复的删掉
if(self::isServerExist($server_name)){
self::removeRepeat($server_name);
}else{
if(self::isFull()){
//如果已经满了,要把队列最后一个记录删掉
array_pop($this->server_arr);
}
}
//如果队列为空,先置为空数组
if(empty($this->server_arr))
$this->server_arr = array();
//向队列头添加数据
array_unshift($this->server_arr,$server_name);
}
private function isFull()
{
if(is_array($this->server_arr) && (count($this->server_arr) >= $this->length))
return true;
return false;
}
private function isServerExist($server_name)
{
if(is_array($this->server_arr) && in_array($server_name,$this->server_arr))
return true;
return false;
}
private function removeRepeat($server_name)
{
if(is_array($this->server_arr) && in_array($server_name,$this->server_arr))
{
foreach($this->server_arr as $key=>$value)
{
if($server_name == $value)
{
$this->array_remove($this->server_arr,$key);
}
}
}
}
private function array_remove(&$arr, $offset) {
array_splice ( $arr, $offset, 1 );
}
}/*}}}*/
require_once('queue_svc.php');
class CookieSvc
{/*{{{*/
const COOKIE_KEY = "GAME_SERVER";
const SEPARATE = "|";
const COOKIE_LENGTH = "2";
public function getCookieArr()
{/*{{{*/
$server_str = $_COOKIE[self::COOKIE_KEY];
$server_str = $_COOKIE['GAME_SERVER'];
if($server_str == ''){
$result = array();
}else{
$result = explode(self::SEPARATE,$server_str);
}
return $result;
}/*}}}*/
public function set($cookie_id)
{/*{{{*/
$server_arr = self::getCookieArr();
if($cookie_id != false)
{
$que = new QueueSvc(self::COOKIE_LENGTH,$server_arr);
$que->set($cookie_id);
$server_new = $que->getServerArr();
if(is_array($server_new))
{
$cookie_str = implode(self::SEPARATE,$server_new);
setcookie(self::COOKIE_KEY,$cookie_str,time()+3600,'/');
}
}
}/*}}}*/
}/*}}}*/
class CookieSvc
{/*{{{*/
const COOKIE_KEY = "GAME_SERVER";
const SEPARATE = "|";
const COOKIE_LENGTH = "2";
public function getCookieArr()
{/*{{{*/
$server_str = $_COOKIE[self::COOKIE_KEY];
$server_str = $_COOKIE['GAME_SERVER'];
if($server_str == ''){
$result = array();
}else{
$result = explode(self::SEPARATE,$server_str);
}
return $result;
}/*}}}*/
public function set($cookie_id)
{/*{{{*/
$server_arr = self::getCookieArr();
if($cookie_id != false)
{
$que = new QueueSvc(self::COOKIE_LENGTH,$server_arr);
$que->set($cookie_id);
$server_new = $que->getServerArr();
if(is_array($server_new))
{
$cookie_str = implode(self::SEPARATE,$server_new);
setcookie(self::COOKIE_KEY,$cookie_str,time()+3600,'/');
}
}
}/*}}}*/
}/*}}}*/
不多解释了,这个别人用的不多,昨天因为需要写的,留一下吧,也许以后还用得到。。
调用的代码很简单:
require_once("queue_svc.php");
require_once("cookie_svc.php");
$cookie_id = '4';
CookieSvc::set($cookie_id);
require_once("cookie_svc.php");
$cookie_id = '4';
CookieSvc::set($cookie_id);
这样就可以了。呼。。大家可以每次把$cookie_id换做不同的值,来检验此操作。
检验的代码可以用如下代码:
var_dump($_COOKIE);
文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/08/11/1341/
版权所有 © 转载时必须以链接形式注明作者和原始出处!
这次不占沙发,也不占房顶,占设计图。。。
[回复]
@虾
呃。。呵呵。。。谢谢捧场。
[回复]
代码高亮的不错。
什么时候写一些与WordPress相关的啊,呵呵
[回复]
不错,我要研究一下cookies的操作方法
@James
代码是万能的,改一下用到那里都行
[回复]
wc去么?http://2009.wordcampchina.org/beijing2009/attendees
[回复]
@James
の,我没有读过WP的源码,对那个也不太感兴趣。
可能碰到才会写吧。呵呵。
[回复]
@Showfom
可以带家属不。。呼。。我想一下吧。呵呵。
[回复]
@bolo
这个其实是我们的一个新需求,全部代码,只有关于我们业务的没在这了,别的都在。呵呵。
[回复]
最近在从0基础学些Php
这个对我来说还有点难度
[回复]
准时上课是好孩子….
[回复]
@要饭的
慢慢来呗。呵呵。。 :P
[回复]
呵呵,收藏了
[回复]
@荒野无灯
开学了,又见到你了,想我不?哈。
[回复]
不错哈,你的编码作风也很好,GOOD,现在还可以用SPL里面的队列出做,也很不错哦
[回复]
敢问博主,第一个类里self::isServerExist($server_name)为什么不是使用this而是使用self,是习惯上还是性能上要这样写。本人新手,求解,望解答。
[回复]
simaopig 回复:
十一月 25th, 2011 at 6:11 下午
是这样的。用this也是没有问题的。确实是习惯使然。习惯上将所有方法做为静态方法来使。所以使用self::MethodName
[回复]
过两天来看答案 回复:
十一月 25th, 2011 at 11:13 下午
等不到两天就来看了,谢谢博主回答。纠结这个问题很久了,$this->方法,self::方法,类名::方法,。。。
[回复]
simaopig 回复:
十一月 28th, 2011 at 9:51 上午
在类本身里面,用类名和self均是调用静态方法,均可。self替代了类名。而在其他类里面,如果是实例化的对象就要使用this方法了,如果是静态方法就可以使用类名::方法 !
如果是实例化的对象就要使用this方法,不是很懂
[回复]