2009-09-22 54 views
0

下面是我遇到的麻煩的一個非常基本的例子。PHP類範圍問題

現在爲什麼我必須使用$ session = new Session();database.class.php文件,當我在我的系統中的文件被包含在一個方式,它已經可見了。

換句話說,我不能調用$ 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); 
    } 
} 
+1

我在任何地方都看不到'$ session = new Session();'。它可以幫助我們理解你的問題。 – MitMaro 2009-09-23 00:00:10

+0

@MitMaro對不起,這個類是在腳本的其他地方啓動的,我只想開始它,但是這種方式現在要求我在每個使用另一個文件中的類的類文件中啓動它 – JasonDavis 2009-09-23 00:13:35

回答

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::getInstance()。只有一個會話創建實例,您可以在腳本中全局使用它。

+0

感謝代碼,這可能是唯一的解決方案,但我會問無論如何,是否有可能調用類似$ session = new $ session();例如一個index.php文件,然後能夠在其他類中使用它的方法或者包含在索引文件中的任何其他文件,而不必在每個文件中創建新的實例? – JasonDavis 2009-09-23 00:16:12

+0

我更新了我的答案,但它並沒有真正回答你的問題。你可以使用$ GLOBALS [http://us2.php.net/manual/en/reserved.variables.globals.php],但Singleton更好。 – MitMaro 2009-09-23 00:28:34

+0

我現在明白單身的事情,但我仍然有同樣的錯誤,基本上我得到錯誤,如果我不啓動每個物理頁面上的類,我需要使用它,所以我的問題有點是與單身人士相反,而不是需要該類開始1次我需要在包含在需要使用該類中的方法的頁面中的每個文件中啓動它。希望我是有道理的,這迫使我試圖找出爲什麼我必須在每個文件上啓動它。如果index.php和test1.php,test2.php,test3.php都包含在index.php文件中,爲避免出現 – JasonDavis 2009-09-23 01:00:00

2

首先,你的會話類應該是一個單 - 的原因是多次調用在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)

+0

You beat我對它和你提供了一個例子。 +1 – MitMaro 2009-09-23 00:02:50

+0

雖然你在單例中有一些錯誤,但你沒有返回實例。 – MitMaro 2009-09-23 00:03:40

+0

是的,這是固定的 - 咖啡時間我猜8) – 2009-09-23 00:04:27