原始代码在这里,是一套开源php系统里的一个文件 session_mysql.class.php
里面第一个函数 function PbSessions() 里对session_set_save_handler()的调用,array(&$this,'open') 这样形式的参数是什么意思,小弟初学php,实在看不明白,请高手不吝赐教!session_set_save_handler(array(&$this,'open'), array(&$this,'close'), array(&$this,'read'), array(&$this,'write'), array(&$this,'destroy'), array(&$this,'gc'));
<?php
class PbSessions {
var $save_handler = "database"; //memcache,mysql,apc
var $security = "high"; //high,medium,low
var $lifetime = 1440;
var $sess_table;
var $table_prefix;
var $db;
var $id;
var $time;
var $sesskey;
var $expiry;
var $last_activity;
var $expireref;
var $data; function PbSessions() {
session_set_save_handler(array(&$this,'open'), array(&$this,'close'), array(&$this,'read'), array(&$this,'write'), array(&$this,'destroy'), array(&$this,'gc'));
session_cache_limiter('private, must-revalidate');
session_start();
}
function __construct()
{
$this->PbSessions();
} function open($save_path, $session_name, $persist = null) {
global $pdb, $tb_prefix, $time_stamp;
$this->time = $time_stamp;
$this->table_prefix = $tb_prefix;
$this->sess_table = $tb_prefix.'sessions';
$this->db = &$pdb;
return true;
} function close() {
$this->gc();
return true;
} function read($sid) {
$result = $this->db->GetRow("SELECT data FROM {$this->sess_table} WHERE sesskey='$sid'");
return $result ? $result['data'] : null;
} function write($sid, $sess_data) {
$sess_data = pb_addslashes($sess_data);
$expiry = $this->time+$this->lifetime;
$sql = "SELECT * FROM {$this->sess_table} WHERE sesskey='{$sid}'";
$result = $this->db->GetRow($sql);
if(!empty($result)){
$sql = "UPDATE {$this->sess_table} SET data='$sess_data',expiry='$expiry',modified='$this->time' WHERE sesskey='{$sid}'";
$this->db->Execute($sql);
}else{
$this->db->Execute("INSERT INTO {$this->sess_table} (sesskey,data,expiry,expireref,created,modified) VALUES('$sid', '$sess_data', '$expiry', '".pb_getenv('PHP_SELF')."', '$this->time', '$this->time')");
}
return true;
} function destroy($sid) {
$this->db->query("DELETE FROM {$this->sess_table} WHERE sesskey='$sid'");
return true;
} function gc() {
$expiretime = $this->time-$this->lifetime;
$this->db->Execute("DELETE FROM {$this->sess_table} WHERE expiry<{$expiretime}");
return true;
}
function unserializes($data) {
$vars = preg_split(
'/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\|/',
$data, -1, PREG_SPLIT_NO_EMPTY |
PREG_SPLIT_DELIM_CAPTURE
);
for ($i = 0; isset($vars[$i]); $i++) {
$result[$vars[$i++]] = unserialize($vars[$i]);
}
return $result;
}
}
?>
里面第一个函数 function PbSessions() 里对session_set_save_handler()的调用,array(&$this,'open') 这样形式的参数是什么意思,小弟初学php,实在看不明白,请高手不吝赐教!session_set_save_handler(array(&$this,'open'), array(&$this,'close'), array(&$this,'read'), array(&$this,'write'), array(&$this,'destroy'), array(&$this,'gc'));
<?php
class PbSessions {
var $save_handler = "database"; //memcache,mysql,apc
var $security = "high"; //high,medium,low
var $lifetime = 1440;
var $sess_table;
var $table_prefix;
var $db;
var $id;
var $time;
var $sesskey;
var $expiry;
var $last_activity;
var $expireref;
var $data; function PbSessions() {
session_set_save_handler(array(&$this,'open'), array(&$this,'close'), array(&$this,'read'), array(&$this,'write'), array(&$this,'destroy'), array(&$this,'gc'));
session_cache_limiter('private, must-revalidate');
session_start();
}
function __construct()
{
$this->PbSessions();
} function open($save_path, $session_name, $persist = null) {
global $pdb, $tb_prefix, $time_stamp;
$this->time = $time_stamp;
$this->table_prefix = $tb_prefix;
$this->sess_table = $tb_prefix.'sessions';
$this->db = &$pdb;
return true;
} function close() {
$this->gc();
return true;
} function read($sid) {
$result = $this->db->GetRow("SELECT data FROM {$this->sess_table} WHERE sesskey='$sid'");
return $result ? $result['data'] : null;
} function write($sid, $sess_data) {
$sess_data = pb_addslashes($sess_data);
$expiry = $this->time+$this->lifetime;
$sql = "SELECT * FROM {$this->sess_table} WHERE sesskey='{$sid}'";
$result = $this->db->GetRow($sql);
if(!empty($result)){
$sql = "UPDATE {$this->sess_table} SET data='$sess_data',expiry='$expiry',modified='$this->time' WHERE sesskey='{$sid}'";
$this->db->Execute($sql);
}else{
$this->db->Execute("INSERT INTO {$this->sess_table} (sesskey,data,expiry,expireref,created,modified) VALUES('$sid', '$sess_data', '$expiry', '".pb_getenv('PHP_SELF')."', '$this->time', '$this->time')");
}
return true;
} function destroy($sid) {
$this->db->query("DELETE FROM {$this->sess_table} WHERE sesskey='$sid'");
return true;
} function gc() {
$expiretime = $this->time-$this->lifetime;
$this->db->Execute("DELETE FROM {$this->sess_table} WHERE expiry<{$expiretime}");
return true;
}
function unserializes($data) {
$vars = preg_split(
'/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\|/',
$data, -1, PREG_SPLIT_NO_EMPTY |
PREG_SPLIT_DELIM_CAPTURE
);
for ($i = 0; isset($vars[$i]); $i++) {
$result[$vars[$i++]] = unserialize($vars[$i]);
}
return $result;
}
}
?>
例如:
$a = 1;
function test ( &$b)
{
$b++;
};
test( $a );
echo $a;
输出了2,
如果不加&那么a还是1
只能出现在类中,其中 open 为类的一个方法;$this 为实例化后的类本身
由于需要传递的是引用,所以在 $this 前要加上 &。
这只是 php4 的写法, 到 php5 全部对象都默认以引用方式传递,只需写作 array($this,'open')
解释下session_set_save_handler()session_set_save_handler() 设置用户级 session 存储函数,用于存储和取回 session 相关的数据. 用于那些使用不同于 PHP Session 指定的存储方式的情况. 例如,在本地数据库存储 session 数据.
注意: 你必须设置 php.ini 里面的 session.save_handler 配置参数来让 session_set_save_handler() 正常工作. session_set_save_handler(
"sess_open", /* session_start()调用 */
"sess_close", /* 程序结束时调用 */
"sess_read", /* session_start()调用 */
"sess_write", /* 程序结束时调用 */
"sess_destroy", /* session_destroy()调用 */
"sess_gc" /* 操作系统gc进程调用 */
);
这个数组形式的参数意思其实是 this->open(),但由于要写在函数参数里,必须要写成数组的形式array(&$this,'open')?
就是调用这个数组参数第一个元素的、以第二个参数为名称的方法?
也就在类里出现这样形式的数组参数,只能是一个两元素数组,而且第一个元素就是一个实例对象,第二个参数是该实例对象的一个方法?
请各个高手看一下这个理解是不是正确的?谢谢!!
凡是将对象的方法作为参数传递都需要使用这种形式:array(对象, "方法名")