以下是我遇到麻烦的一个非常基本的例子。
现在为什么我必须在 database.class.php 文件中使用 $ session = new Session(); ,而在我的系统中,文件包含的方式是它已经可见了。
换句话说,我不能调用$ session = new Session();在任何其他类之外,为了使它在我必须调用的其他类中工作,在我想要使用它的每个类中创建会话类的新对象,我怎样才能避免这种情况并使其无需执行呢?
// Session.class.php
class Session{
public function __construct()
{
session_start();
}
public function set($name, $value)
{
$_SESSION[$name] = $value;
}
}
...
// Database.class.php
class Database{
public static function mysql_query_2($query)
{
if ($session->get('user_role') == 10){
$_SESSION['queries']++;
}
return mysql_query($query);
}
}
答案 0 :(得分:2)
首先,你的Session类应该是一个单例 - 原因是多次调用session_start()只会让你遇到问题(会话id被重新生成)
所以......
/**
* Session singleton class
*/
class Session
{
// prevents object instanciation ($obj = new Session())
protected function __construct() {
session_start();
}
// prevents object cloning
protected function __clone() {}
public static function getInstance()
{
static $instance = null;
if ($instance == null)
$instance = new Session();
return $instance;
}
// rest of the code
}
要使用它,您只需致电:
$sess = Session::getInstance();
$sess->doSomething();
或只是
Session::getInstance()->doSomething();
您需要使用会话类的任何地方。
更新: - 我觉得你可能还没有掌握单身人士的概念,所以这是一个合适的wikipedia link 8)
答案 1 :(得分:1)
如果我正确理解您的问题,您问题的一个解决方案是使用Singleton。
final class Singleton {
protected static $_instance;
// Singleton can't be constructed or cloned
protected function __construct(){ }
protected function __clone() { }
// Create an instance if necessary and return an instance.
public static function getInstance(){
if( self::$_instance === NULL ) {
session_start();
self::$_instance = new self();
}
return self::$_instance;
}
public function set($name, $value){
$_SESSION[$name] = $value;
}
}
在index.php
中你会得到:
$session = Session::getInstance();
$session->get();
然后在您的数据库类中,您将拥有:
// Database.class.php
class Database{
public static function mysql_query_2($query)
{
if (Session::getInstance()->get('user_role') == 10){
$_SESSION['queries']++;
}
return mysql_query($query);
}
}
您只会创建一个Session类的实例(这是我认为您正在寻找的)。然后当你需要其他地方的Session类(即你的数据库类)时,你只需再次调用Session::getInstance()
。只创建了一个Session实例,您可以在脚本中全局使用它。