ThinkPHP源码学习 cookie函数 设置 取值 删除

发布时间:2020-08-10 19:33:44 作者:津沙港湾
来源:网络 阅读:715

/**
 * Cookie 设置、获取、删除
 * @param string $name cookie名称
 * @param mixed $value cookie值
 * @param mixed $option cookie参数
 * @return mixed
 */

系统内置了一个cookie函数用于支持和简化Cookie的相关操作,该函数可以完成Cookie的设置、获取、删除操作。

Cookie设置

cookie('author','津沙港湾','3600');

执行代码段

$expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0;
//intval — 获取变量的整数值
setcookie($name, $value, $expire, $config['path'], $config['domain'],$config['secure'],
$config['httponly']);
$_COOKIE[$name] = $value;

结果为

array (size=4)
  'pgv_pvi' => string '3174355968' (length=10)
  'PHPSESSID' => string 'u1v6kbhgfn583pl7ku8qs0vk53' (length=26)
  'name' => string 'value' (length=5)
  'author' => string '津沙港湾' (length=12)


还可以支持参数传入的方式完成复杂的cookie赋值,下面是对cookie的值设置3600秒有效期,并且加上cookie前缀think_


cookie('author','津沙港湾',array('expire'=>3600,'prefix'=>'think_'));

执行代码段

(解析$option数组)$option=array('expire'=>3600,'prefix'=>'think_')

 $config     = array_merge($config, array_change_key_case($option));

结果为

array (size=6)
  'prefix' => string 'think_' (length=6)
  'expire' => int 3600
  'path' => string '/' (length=1)
  'domain' => string '' (length=0)
  'secure' => boolean false
  'httponly' => string '' (length=0)

($name前加一个前缀think_)

 $name = $config['prefix'] . str_replace('.', '_', $name);

结果为

'think_author' => string '津沙港湾'


数组参数可以采用query形式参数


cookie('author','津沙港湾','expire=3600&prefix=think_');

执行代码段

(解析$option字符串)$option='expire=3600&prefix=think_'

 parse_str($option, $option); //parse_str — 将字符串解析成多个变量

结果为($option变成数组)

$option数组输出值
array (size=2)
  'expire' => string '3600' (length=4)
  'prefix' => string 'think_' (length=6)

$option 参数 分别为整型、字符串、数组 代码段

    if (!is_null($option)) {
        //整型转成数组
        if (is_numeric($option)){
            $option = array('expire' => $option);
        //字符串转成数组
        }elseif(is_string($option)){
            parse_str($option, $option); 
            }
        //数组合并   
        $config     = array_merge($config, array_change_key_case($option));        

    }



支持给cookie设置数组值(采用JSON编码格式保存)


cookie('author',array('津沙港湾','崎沙小香港'));

执行代码段

            if(is_array($value)){
                $value  = 'think:'.json_encode(array_map('urlencode',$value));
            }

结果为

'author' => string '
think:
["%E6%B4%A5%E6%B2%99%E6%B8%AF%E6%B9%BE","%E5%B4%8E%E6%B2%99%E5%B0%8F%E9%A6%99%E6%B8%AF"]'

注意格式手动调整一下方便阅读json编码格式。

Cookie获取

$value=cookie('author');

执行代码段

 $value =    $_COOKIE[$name];
 if(0===strpos($value,'think:')){
 $value  =   substr($value,6);//去掉think:
return array_map('urldecode',json_decode(MAGIC_QUOTES_GPC?stripslashes($value):$value,true));
  }else{
                return $value;
            }

结果为

author对应的值
array (size=2)
  0 => string '津沙港湾' (length=12)
  1 => string '崎沙小香港' (length=15)

详细分析$value=cookie('author');解码过程

array_map('urldecode',json_decode(MAGIC_QUOTES_GPC?stripslashes($value):$value,true));

第一步

stripslashes()函数处理

返回一个去除转义反斜线后的字符串,

第二步

json_decode()函数处理,

接受一个 JSON 格式的字符串并且把它转换为 PHP 变量,

json_decode()中设置true时,按数组格式返回变量,

第三步

array_map()函数处理,

json_decode()函数返回的数组传递给urldecode回调函数进行解码。

最后返回数组。


如果要获取所有的cookie,可以使用:

$value=cookie();

执行代码段

if (is_null($name)) {
//这部分代码省略
    }elseif('' === $name){//$name为空字符串才行 ===恒等于 判断值和类型都要相等
        // 获取全部的cookie
        return $_COOKIE;
    }


Cookie删除

删除某个cookie的值,使用:

$value=cookie('author',null);

执行代码段

if (is_null($value)) {
            setcookie($name, '', time() - 3600, $config['path'], $config['domain'],
            $config['secure'],$config['httponly']);
            unset($_COOKIE[$name]); // 删除指定cookie


要删除所有的Cookie值,可以使用:

$value=cookie(null);//清空当前设定前缀的所有cookie值

cookie(null,'think_'); //  清空指定前缀的所有cookie值

执行代码段

    if (is_null($name)) {
        if (empty($_COOKIE))
            return null;
        // 要删除的cookie前缀,不指定则删除config设置的指定前缀
        $prefix = empty($value) ? $config['prefix'] : $value;
        if (!empty($prefix)) {// 如果前缀为空字符串将不作处理直接返回
            foreach ($_COOKIE as $key => $val) {
                if (0 === stripos($key, $prefix)) { 
 setcookie($key, '', time() - 3600, $config['path'],
 $config['domain'],$config['secure'],$config['httponly']);
                    unset($_COOKIE[$key]);
                }
            }
        }
        return null;
    }

代码逻辑判断

function cookie($name='', $value='', $option=null) {

    $config = array( 
    );
  
    if ($option不为空) {
        if ($option为整型){
           $option将整型转为数组
            }
        elseif ($option为字符串){
          $option将字符串转为数组;
          }
        $option为数组
        $option数组合并到$config数组中去    
    }
    
    if(!empty($config['httponly'])){
        ini_set("session.cookie_httponly", 1);
    }

    
    
    if ($name为空null) {
                        if ($_COOKIE为空){
                            return null;
                            }
                       $prefix = empty($value) ? $config['prefix'] : $value;
                        if ($prefix不为空) {
                            删除$prefix的cookie
                        }
                        return null;
    }elseif('' === $name){
                        // 获取全部的cookie
                        return $_COOKIE;
    }
    
    
    
    $name = $config['prefix'] . str_replace('.', '_', $name);

    if ('' === $value) {//$value为空字符串
                if(isset($_COOKIE[$name])){
                    $value =    $_COOKIE[$name];
                                    if(0===strpos($value,'think:')){
                                        //解码$value 等于取值
                                    }else{
                                        return $value;
                                    }
                }else{
                    return null;
                }
    } else {
        if (is_null($value)) {
                //删除$name的cookie
        } else {
                      if(is_array($value)){
                        $value  = 'think:'.json_encode(array_map('urlencode',$value));
                    }
            设置cookie
        }
    }
    return null;
}

更一步简化逻辑判断分支

function cookie($name='', $value='', $option=null) {


    if ($option不为空) {
        $option 参数 分别为整型、字符串、数组 代码段
        $option数组合并到$config数组中去    
    }
    
    
    if ($name为空null) {
           $_COOKIE为空 返回null
           $prefix不为空 删除$prefix的cookie             
    }elseif($name为空字符串){
               // 获取全部的cookie                  
    }
      
     
    $name为某个值
    取值
    if ($value为空字符串) {
         取$name的值
        } else {
                 if (is_null($value)) {
                //删除$name的cookie
                  } else {                     
                  设置cookie
        }
    
    return null;
}

由上面的逻辑判断if语句可以看出

根据$name=''空字符串(获取全部cookie),

       $name=空null, (删除$prefix的cookie)

       $name='某个值'(取值|设置值){

       $value=''空字符串(取值),

        $value=空null(删除$name的cookie),

        $value='某个值'(设置值)}

        $option 参数 分别为整型、字符串()、数组 三种情况进行设计。
附上Cookie函数(源代码)

/**
 * Cookie 设置、获取、删除
 * @param string $name cookie名称
 * @param mixed $value cookie值
 * @param mixed $option cookie参数
 * @return mixed
 */
function cookie($name='', $value='', $option=null) {
    // 默认设置
    $config = array(
        'prefix'    =>  C('COOKIE_PREFIX'), // cookie 名称前缀
        'expire'    =>  C('COOKIE_EXPIRE'), // cookie 保存时间
        'path'      =>  C('COOKIE_PATH'), // cookie 保存路径
        'domain'    =>  C('COOKIE_DOMAIN'), // cookie 有效域名
        'secure'    =>  C('COOKIE_SECURE'), //  cookie 启用安全传输
        'httponly'  =>  C('COOKIE_HTTPONLY'), // httponly设置
    );
    // 参数设置(会覆盖黙认设置)
    if (!is_null($option)) {
        if (is_numeric($option))
            $option = array('expire' => $option);
        elseif (is_string($option))
            parse_str($option, $option);
        $config     = array_merge($config, array_change_key_case($option));
    }
    if(!empty($config['httponly'])){
        ini_set("session.cookie_httponly", 1);
    }
    // 清除指定前缀的所有cookie
    if (is_null($name)) {
        if (empty($_COOKIE))
            return null;
        // 要删除的cookie前缀,不指定则删除config设置的指定前缀
        $prefix = empty($value) ? $config['prefix'] : $value;
        if (!empty($prefix)) {// 如果前缀为空字符串将不作处理直接返回
            foreach ($_COOKIE as $key => $val) {
                if (0 === stripos($key, $prefix)) {
  setcookie($key, '', time() - 3600, $config['path'], 
  $config['domain'],$config['secure'],$config['httponly']);
                    unset($_COOKIE[$key]);
                }
            }
        }
        return null;
    }elseif('' === $name){
        // 获取全部的cookie
        return $_COOKIE;
    }
    $name = $config['prefix'] . str_replace('.', '_', $name);
    if ('' === $value) {
        if(isset($_COOKIE[$name])){
            $value =    $_COOKIE[$name];
            if(0===strpos($value,'think:')){
                $value  =   substr($value,6);
                return array_map('urldecode',
                json_decode(MAGIC_QUOTES_GPC?stripslashes($value):$value,true));
            }else{
                return $value;
            }
        }else{
            return null;
        }
    } else {
        if (is_null($value)) {
            setcookie($name, '', time() - 3600, $config['path'], 
            $config['domain'],$config['secure'],$config['httponly']);
            unset($_COOKIE[$name]); // 删除指定cookie
        } else {
            // 设置cookie
            if(is_array($value)){
                $value  = 'think:'.json_encode(array_map('urlencode',$value));
            }
            $expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0;
            setcookie($name, $value, $expire, $config['path'], 
            $config['domain'],$config['secure'],$config['httponly']);
            $_COOKIE[$name] = $value;
        }
    }
    return null;
}


推荐阅读:
  1. thinkphp-删除delete函数
  2. Django框架学习笔记

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php think 源码学习

上一篇:rman中report命令

下一篇:struts2 jquery ajax 局部刷新遇到的各种问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》