《PHP學習:ThinkPHP中session函數詳解》要點:
本文介紹了PHP學習:ThinkPHP中session函數詳解,希望對您有用。如果有疑問,可以聯系我們。
相關主題:thinkphp教程
PHP編程在PHP中使用$_SESSION來操作session,而ThinkPHP提供了session的封裝函數session().單單這一個函數就實現了session的增刪改查的功能.下面我們分別來看其應用與實現.
PHP編程該session()函數的定義是在Common/functions.php中定義.
PHP編程session配置
PHP編程session($name='',$value='')函數有兩個參數,$name為數組的時候是對session進行設置.使用如下:
PHP編程
$name = array(
‘name'=>'name',
‘path'=>'/tmp/',
‘expire'=>0
);
session($name);
PHP編程這些是在開啟session之前進行設置的.在ThinkPHP中定義該函數的時候是先判斷$name是否為數組,如果為數組的話就說明是在對session進行設置,然后進入相應的代碼執行設置.
PHP編程其實現代碼如下:
PHP編程
if(is_array($name)) { // session初始化 在session_start 之前調用
if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']);
if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){
session_id($_REQUEST[C('VAR_SESSION_ID')]);
}elseif(isset($name['id'])) {
session_id($name['id']);
}
if('common' != APP_MODE){ // 其它模式可能不支持
ini_set('session.auto_start', 0);
}
if(isset($name['name'])) session_name($name['name']);
if(isset($name['path'])) session_save_path($name['path']);
if(isset($name['domain'])) ini_set('session.cookie_domain', $name['domain']);
if(isset($name['expire'])) {
ini_set('session.gc_maxlifetime', $name['expire']);
ini_set('session.cookie_lifetime', $name['expire']);
}
if(isset($name['use_trans_sid'])) ini_set('session.use_trans_sid',$name['use_trans_sid']?1:0);
if(isset($name['use_cookies'])) ini_set('session.use_cookies', $name['use_cookies']?1:0);
if(isset($name['cache_limiter'])) session_cache_limiter($name['cache_limiter']);
if(isset($name['cache_expire'])) session_cache_expire($name['cache_expire']);
if(isset($name['type'])) C('SESSION_TYPE',$name['type']);
……
}
PHP編程在ThinkPHP中,對于session的存儲系統提供了mysql和memache兩種數據庫.當然默認情況下是使用文件存儲.判斷session存儲方式的代碼如下:
PHP編程
if(C('SESSION_TYPE')) { // 讀取session驅動
$type = C('SESSION_TYPE');
//系統調用mysql驅動程序
$class = strpos($type,'\\')? $type : 'Think\\Session\\Driver\\'. ucwords(strtolower($type));
$hander = new $class(); //實例化處理器
//注冊處理器
session_set_save_handler(
array(&$hander,"open"),
array(&$hander,"close"),
array(&$hander,"read"),
array(&$hander,"write"),
array(&$hander,"destroy"),
array(&$hander,"gc")
);
}
PHP編程對于session存儲系統的配置是通過配置選項SESSION_TYPE來設置的.
PHP編程SESSION_TYPE=>'Mysql'? //將session存儲在mysql數據庫中
PHP編程設置完成以后如果設置了session自動啟動,那系統會自動開啟session
PHP編程
// 啟動session
if(C('SESSION_AUTO_START')) session_start();
PHP編程如果想關閉session自啟動,對選項SESSION_AUTO_START設置如下:
PHP編程SESSION_AUTO_START => false
PHP編程如果關閉了系統自啟動,可以在項目的公共文件或者在控制器中通過手動調用session_start()來開啟session.或者使用函數session(),其開啟方法如下:
PHP編程session(‘[start]');
PHP編程在ThinkPHP中其實現代碼如下:
PHP編程
if('[pause]'==$name){ // 暫停session
session_write_close();
}elseif('[start]'==$name){ // 啟動session
session_start();
}elseif('[destroy]'==$name){ // 銷毀session
$_SESSION = array();
session_unset();
session_destroy();
}elseif('[regenerate]'==$name){ // 重新生成id
session_regenerate_id();
}
PHP編程session賦值
PHP編程session賦值比較簡單,直接使用:
PHP編程session('name','onmpw');
PHP編程除此之外對于鍵值還可以是多層的中間使用‘.'連接.
PHP編程session(‘name1.name2','onmpw');? //等價于 $_SESSION[‘name1'][‘name2'] = ‘onmpw';
PHP編程在ThinkPHP中對于session賦值的實現代碼如下:
PHP編程
if(strpos($name,'.')){
list($name1,$name2) = explode('.',$name);
if($prefix){
$_SESSION[$prefix][$name1][$name2] = $value;
}else{
$_SESSION[$name1][$name2] = $value;
}
}else{
if($prefix){
$_SESSION[$prefix][$name] = $value;
}else{
$_SESSION[$name] = $value;
}
}
PHP編程$prefix是通過選項SESSION_PREFIX來配置的.
PHP編程session取值
PHP編程session取值相對來說也是比較簡單的.
PHP編程首先是獲取全部的session,使用方法如下
PHP編程$values = session();
PHP編程此時得到的是一個數組.在ThinkPHP中實現代碼如下:
PHP編程
if(''===$name){
// 獲取全部的session
return $prefix ? $_SESSION[$prefix] : $_SESSION;
}
PHP編程再就是取出單個值
PHP編程
$value1 = session(‘name');
//或者
$value2 = session(‘name1.name2');
PHP編程其實現代碼如下:
PHP編程
if(strpos($name,'.')){
list($name1,$name2) = explode('.',$name);
return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:null;
}else{
return isset($_SESSION[$name])?$_SESSION[$name]:null;
}
PHP編程session刪除
PHP編程session的刪除分為清空session,銷毀session和刪除單個session值.
PHP編程先說清空session.清空session傳參給$name的值為null
PHP編程session(null); //清空session
PHP編程其實現代碼如下:
PHP編程
if(is_null($name)){ // 清空session
if($prefix) {
unset($_SESSION[$prefix]);
}else{
$_SESSION = array();
}
}
PHP編程清空session只是將session對應的文件或者表中的數據清除,但是文件還是會存在的.
PHP編程銷毀session
PHP編程session(‘[destroy]');
PHP編程其ThinkPHP中的實現代碼如下:
PHP編程
if('[destroy]'==$name){ // 銷毀session
$_SESSION = array();
session_unset();
session_destroy();
}
PHP編程銷毀session和清空session不同的是銷毀session會將文件一并銷毀.
PHP編程最后就是刪除單個session值.使用方式如下
PHP編程session(‘name',null);
PHP編程刪除單個session值,將第二個參數$value的值設為null即可刪除.
PHP編程
if(is_null($value)){ // 刪除session
if(strpos($name,'.')){
list($name1,$name2) = explode('.',$name);
if($prefix){
unset($_SESSION[$prefix][$name1][$name2]);
}else{
unset($_SESSION[$name1][$name2]);
}
}else{
if($prefix){
unset($_SESSION[$prefix][$name]);
}else{
unset($_SESSION[$name]);
}
}
}
PHP編程檢查session
PHP編程最后簡單介紹對session的檢查.檢查是指一個變量是否存在.原生的PHP檢查session變量是這樣檢查的
PHP編程isset($_SESSION[‘name']);
PHP編程ThinkPHP封裝之后使用session()函數是這樣檢查
PHP編程session(‘?name'); //判斷一個session是否已經設置
PHP編程其代碼實現也是利用了原生的檢查的方式
PHP編程
$name = substr($name,1);
if(strpos($name,'.')){ // 支持數組
list($name1,$name2) = explode('.',$name);
return $prefix?isset($_SESSION[$prefix][$name1][$name2]):isset($_SESSION[$name1][$name2]);
}else{
return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]);
}
PHP編程以上幾乎是對session()函數各個功能的使用介紹,以及ThinkPHP是如何實現的.希望本文的內容對大家在使用ThinkPHP過程中起到一些幫助作用.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/3807.html