2016-01-30 36 views
1

我有2個文件。 一個是index.php的,其檢查用戶登錄 在該文件I創建dbManager類處理的數據庫。 如果dbManager可以驗證登錄數據,我將用戶轉發到lobby.php(通過頭文件)。PHP在幾個文件中使用類變量?

在lobby.php,我創建用於管理大堂經理類。 我想能夠使用Manager類的查詢轉發給DB經理是這樣的:

的index.php

$dbManager = new dbManager(); 
$userid = $dbManager->validateLogin(($_POST["name"], $_POST["pass"]; 

if ($userid){ 
    $_SESSION["userid"] = $userid; 
    header("Location: lobby.php"); 
} 

lobby.php

session_start(); 

if (isset($_SESSION["userid"])){  
    $manager = new Manager($_SESSION["userid"]); 
    $manager->getGames(); 
} 



Class dbManager { 
    things 
} 

Class Manager { 
    public userid; 

    function __construct($id){ 
     $this->userid = $id; 
    } 

    function getGames(){ 
     $ret = $dbManager->queryDB($this->userid); 
    } 
} 

我收到了以下聲明:

Notice: Undefined variable: dbManager in D:\SecureWAMP_Portable\htdocs\projectX\gameManager.php on line 11

Fatal error: Call to a member function getGamesForPlayer() on a non-object in D:\SecureWAMP_Portable\htdocs\projectX\gameManager.php on line 11

我到底做錯了什麼?

+0

使用全局變量是不現實的。例如,如果只有一個類的實例,則可以使用單例模式。 – mnv

+0

你說,*我有2個文件... index.php .... lobby.php *,但錯誤顯示問題出現在* gameManager.php *頁面。 –

+0

我真的有超過2個文件,我只是儘可能簡單地在這裏展示它。 –

回答

1

您應該在新文件中定義每個類幷包含這些文件(最好的做法是使用自動加載)。如果你只需要一個類的一個對象,你應該看看Singleton模式,因爲你總是會得到相同的類實例。

對於您定義的靜態保護變量,它會保留我們的類的實例,並使用靜態公共方法返回的類的實例,如果有必要,創建一個新的類實例。我們將每個類的構造函數定義爲私有的,因此必須使用靜態公共方法。

如果您有傳遞給構造函數的參數,請爲靜態公共方法定義它們,並將參數傳遞給靜態公有方法中的構造函數。

文件DBManager.php將定義類DBManager並將使用單例模式,因爲此類將處理與數據庫的連接。

Class DBManager { 
    static protected $instance = NULL 
    private __construct() { 
     //Write the code you want to execute when a new class instance is requested 
     self::$instance = &$this; //Put a reference to this instance in our static variable 
    } 

    //Our static public method to retrieve a class instance 
    static public app() { 
     if(self::$instance === NULL OR !is_a(self::$instance, 'DBManager')) { //With is_a we are making sure our self::$instance variable holds a class instance of DBManager 
      $instance = new DBManager(); 
     } 

     return self::$instance; 
    } 

    /* All your other methods... */ 
} 

我們Manager.php將召開類別管理和檢索DBManager的一個類的實例,我們將調用我們的靜態公共方法應用程序()。也可以使類管理器單例生效,但只有在總是隻有一個類實例存在的情況下才有效。現在

Class Manager { 
    public userid; 

    function __construct($id){ 
     $this->userid = $id; 
    } 

    function getGames() { 
     $ret = DBManager::app()->queryDB($this->userid); 
    } 
} 

我們的基本的index.php只是,而不是使用new DBManager()我們將使用靜態方法返回一個類實例。

require_once 'DBManager.php'; 

$dbManager = DBManager::app(); 
$userid = $dbManager->validateLogin($_POST['name'], $_POST['pass']); 

if($userid) { 
    $_SESSION['userid'] = $userid; 
    header("Location: lobby.php"); 
} 

在我們的lobby.php中,我們將首次使用新的Manager類。

session_start(); 

require_once 'DBManager.php'; 
require_once 'Manager.php'; 

$dbManager = DBManager::app(); 

if(isset($_SESSION['userid'])) { 
    $manager = new Manager($_SESSION['userid']); 
    $manager->getGames(); 
} 
1

你不應該使用全局變量,因爲它是壞的風格,將讓你的生活真的很難當應用程序變得更大。

在你的情況,你要使用的dbManager在不同的班級。 由於db事務可能會經常使用,因此請查看單例模式,因此只能有一個此類實例。

但要知道,你應該保持單身儘可能低的數量。

看看這個頁面,看看如何Singleton模式可以用PHP來實現: http://www.phptherightway.com/pages/Design-Patterns.html

1

你似乎有一個關於PHP代碼是如何分佈在多個文件中使用,並且這些文件是如何使用的誤解。

例如,如果您使用include()require()而不是header(),則可以引用您迄今爲止已定義的數據。

更先進的方法是使用__autoload()[spl_autoload_register()](http://php.net/manual/de/function.spl-autoload-register.php)的類加載到你的腳本,並有一個index.php啓動腳本。

(另請閱讀提供的鏈接@ blacksheep_2011)

1

好的做法是聲明在單獨的文件中的每個類。
之後,您需要將所需的類包含到您計劃使用該類功能的文件中。
創建文件DBManager.php

Class DBManager { 
    things 
} 

創建文件經理。PHP其中將包含Manager類聲明:

include('DBManager.php'); 

Class Manager { 
    public userid; 

    function __construct($id){ 
     $this->userid = $id; 
    } 

    function getGames(){ 
     $dbManager = new DBManager(); 
     $ret = $dbManager->queryDB($this->userid); 
    } 
} 

包括你的類需要的地方:
的index.php

require_once 'DBManager.php'; 

$dbManager = new DBManager(); 
$userid = $dbManager->validateLogin(($_POST["name"], $_POST["pass"]; 

if ($userid){ 
    $_SESSION["userid"] = $userid; 
    header("Location: lobby.php"); 
} 

lobby.php

session_start(); 

require_once 'Manager.php'; 

if (isset($_SESSION["userid"])){  
    $manager = new Manager($_SESSION["userid"]); 
    $manager->getGames(); 
} 
+0

你現在在'$ manager-> getGames()'中獲得'$ dbManager'的位置? –

+0

@CharlotteDunois,謝謝,我對此很生氣。固定 – RomanPerekhrest