最近在做Discuz!的外掛程式,需要用到cookie,一直覺得奇怪的一個問題,Discuz!大量使用了cookie,但是我在編寫外掛程式的時候如果不加入session_start函數cookie就無法使用,按理說Discuz!使用了這麼多cookie它的核心應該有調用session_start呀?而且Discuz!產生的cookie名都是帶有一個首碼的,一直不知道這個首碼規律如何,那我又要如何調用內建的cookie呢?
後來查了一下資料,Discuz!把PHP的setcookie函數封裝成了dsetcookie。順藤摸瓜,在function_core.php裡面找到了這兩個函數:
function dsetcookie($var, $value = '', $life = 0, $prefix = 1, $httponly = false) {
源碼略
}
function getcookie($key)
{
global $_G;
return isset($_G['cookie'][$key]) ? $_G['cookie'][$key] : '';
}
那麼在Discuz!中調用cookie的思路出來了:
設定cookie:dsetcookie('cookie名', 'cookie值', '有效時間');
源碼中dsetcookie還有兩個參數$prefix與$httponly,$prefix為是否添加cookie首碼,true則自動添加網站的首碼,false則不添加,$httponly表示是否只允許http方式訪問,這兩個值只要預設值即可,有需要可另外設定,不過當使用者訪問的是手機版則$httponly會被自動化佈建為false,見function_core.php第272行
if(defined('IN_MOBILE')) {
$httponly = false;
}
讀取cookie有兩種方法,第一種使用getcookie函數:
getcookie('cookie名');
第二種直接存取全域變數$_G:
$_G['cookie']['cookie名']