原始代码在这里,是一套开源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;
    }
}
?>

解决方案 »

  1.   

    &$this this自身  &值引用
      

  2.   

    &这个表示引用,在函数传参数的时候起作用。
    例如:
    $a = 1;
    function test ( &$b)
    {
    $b++;
    };
    test( $a );
    echo $a;
    输出了2,
    如果不加&那么a还是1
      

  3.   

    http://blog.csdn.net/guoguo1980/archive/2010/01/05/5132938.aspx
      

  4.   

    参数形式 array(&$this,'open')
    只能出现在类中,其中 open 为类的一个方法;$this 为实例化后的类本身
    由于需要传递的是引用,所以在 $this 前要加上 &。
    这只是 php4 的写法, 到 php5 全部对象都默认以引用方式传递,只需写作 array($this,'open')
      

  5.   

    楼上的都很强大啊
    解释下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进程调用   */   
      );   
      

  6.   

    是不是可以这样理解:
    这个数组形式的参数意思其实是 this->open(),但由于要写在函数参数里,必须要写成数组的形式array(&$this,'open')?
    就是调用这个数组参数第一个元素的、以第二个参数为名称的方法?
    也就在类里出现这样形式的数组参数,只能是一个两元素数组,而且第一个元素就是一个实例对象,第二个参数是该实例对象的一个方法?
    请各个高手看一下这个理解是不是正确的?谢谢!!
      

  7.   

    基本正确
    凡是将对象的方法作为参数传递都需要使用这种形式:array(对象, "方法名")