首页 > PHP > php 结合COOKIE操作的队列类
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 );
    }
}/*}}}*/
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,'/');
            }
        }
    }/*}}}*/
}/*}}}*/

不多解释了,这个别人用的不多,昨天因为需要写的,留一下吧,也许以后还用得到。。

调用的代码很简单:

require_once("queue_svc.php");

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/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

19 Responses to “php 结合COOKIE操作的队列类”

  1. #1 回复 | 引用 Post:2009-08-11 17:42

    这次不占沙发,也不占房顶,占设计图。。。 :roll:

    [回复]

  2. #2 simaopig 回复 | 引用 Post:2009-08-11 17:45

    @虾
    呃。。呵呵。。。谢谢捧场。

    [回复]

  3. #3 James 回复 | 引用 Post:2009-08-11 20:32

    代码高亮的不错。
    什么时候写一些与WordPress相关的啊,呵呵

    [回复]

  4. #4 bolo 回复 | 引用 Post:2009-08-11 21:40

    不错,我要研究一下cookies的操作方法
    @James
    代码是万能的,改一下用到那里都行

    [回复]

  5. #5 Showfom 回复 | 引用 Post:2009-08-11 22:10

    wc去么?http://2009.wordcampchina.org/beijing2009/attendees

    [回复]

  6. #6 simaopig 回复 | 引用 Post:2009-08-12 08:04

    @James
    の,我没有读过WP的源码,对那个也不太感兴趣。

    可能碰到才会写吧。呵呵。

    [回复]

  7. #7 simaopig 回复 | 引用 Post:2009-08-12 08:06

    @Showfom
    可以带家属不。。呼。。我想一下吧。呵呵。

    [回复]

  8. #8 simaopig 回复 | 引用 Post:2009-08-12 08:07

    @bolo
    这个其实是我们的一个新需求,全部代码,只有关于我们业务的没在这了,别的都在。呵呵。

    [回复]

  9. #9 要饭的 回复 | 引用 Post:2009-08-12 09:13

    最近在从0基础学些Php
    这个对我来说还有点难度

    [回复]

  10. #10 小Bee 回复 | 引用 Post:2009-08-12 10:00

    准时上课是好孩子….

    [回复]

  11. #11 simaopig 回复 | 引用 Post:2009-08-12 11:26

    @要饭的
    慢慢来呗。呵呵。。 :P

    [回复]

  12. #12 荒野无灯 回复 | 引用 Post:2009-08-14 13:04

    呵呵,收藏了

    [回复]

  13. #13 simaopig 回复 | 引用 Post:2009-08-14 16:27

    @荒野无灯
    开学了,又见到你了,想我不?哈。

    [回复]

  14. #14 Cherry 回复 | 引用 Post:2009-11-19 14:31

    不错哈,你的编码作风也很好,GOOD,现在还可以用SPL里面的队列出做,也很不错哦

    [回复]

  15. #15 过两天来看答案 回复 | 引用 Post:2011-11-24 14:47

    敢问博主,第一个类里self::isServerExist($server_name)为什么不是使用this而是使用self,是习惯上还是性能上要这样写。本人新手,求解,望解答。

    [回复]

    simaopig 回复:

    是这样的。用this也是没有问题的。确实是习惯使然。习惯上将所有方法做为静态方法来使。所以使用self::MethodName

    [回复]

    过两天来看答案 回复:

    等不到两天就来看了,谢谢博主回答。纠结这个问题很久了,$this->方法,self::方法,类名::方法,。。。

    [回复]

    simaopig 回复:

    在类本身里面,用类名和self均是调用静态方法,均可。self替代了类名。而在其他类里面,如果是实例化的对象就要使用this方法了,如果是静态方法就可以使用类名::方法 !

  16. #16 过两天来看答案 回复 | 引用 Post:2011-12-02 19:02

    如果是实例化的对象就要使用this方法,不是很懂

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)