PHP类范围问题

时间:2009-09-22 23:49:12

标签: php class

以下是我遇到麻烦的一个非常基本的例子。

现在为什么我必须在 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);
    }
}

2 个答案:

答案 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实例,您可以在脚本中全局使用它。