2013-12-19 51 views
1

我已經有一個連接到數據庫時我包括它的數據庫文件PHP:在一個類中使用一個數據庫

類database.php中

class dbFactory { 
    private static $host = 'some.host.com'; 
    private static $name = 'someDB'; 
    private static $user = 'someUser'; 
    private static $pass = 'somePassword'; 


    public function __construct() { } 


    public static function pdo() { 
     try { 
      # MySQL with PDO_MYSQL 
      return new PDO("mysql:host=$host;dbname=$name", $user, $pass); 
      } 
     catch(PDOException $e) { 
      echo $e->getMessage(); 
      return null; 
      exit; 
      } 
    } // End: pdo() 
} //End class 

我通常訪問此:

require('some-file-path' . 'class-database.php'); 
$db = dbFactory::pdo(); 

這裏有一個問題: 我怎樣才能內的訪問$db從還沒上課?

舉例來說,如果我有一個名爲class-html.php該類中的類文件(AKA,爲的類代碼的一部分),我需要這樣的東西...:

類html.php

class html { 
    ...some code... 
    $db->query('SELECT * FROM tbl_head'); 
    ...some more code... 
} //End: html 

我一直在做沒有成功是:

require('some-file-path' . 'class-database.php'); 
$db = dbFactory::pdo(); 

require('some-file-path' . 'class-html.php'); 

我收到錯誤消息,我不知道該怎麼在這裏做

+0

在這種情況下,創建每個類中新的一個PDO實例,無論答案是什麼我需要解決我的問題。但是,本網站不允許接受兩個條目作爲答案。我該怎麼辦? – Omar

回答

1

你裏面class-html.php類可以被修改了一下,大意如下:

require('some-file-path' . 'class-database.php'); 

class SomeClass { 
    public $db; 

    def __construct() { 
    $db = dbFactory::getPDOinstance(); 
    // existing code .. 
    } 

    // other code  
} 

然後,您可以要求以班級爲平時和:

require('some-file-path' . 'class-html.php'); 
$obj = new SomeClass(); 
$obj->db->query('SELECT * FROM tbl_head') 

UPDATE:如果實例SomeClass不止一次這將創建一個新的PDO實例。
UPDATE:提出了利用kingkero的回答使用現有dbFactory實例,來代替。

+0

可能不想爲每個SomeClass對象創建一個新的PDO對象,也不希望這些對象與其他地方使用的對象不同。 – eggyal

+0

@stoic如果數據庫的一個實例已經啓動了,在這種情況下是$ db,那麼這個「實例」不能在另一個類(html)中訪問,而其他類(html)必須創建一個全新的數據庫實例?我對麼? – Omar

+0

不,您可以在dbFactory中「保存」實例。你可以在[我發佈的wiki鏈接](https://en.wikipedia.org/wiki/Singleton_pattern)上閱讀更多關於 – kero

2

您可以使用Singleton class

class dbFactory { 

    //... 
    private static $pdo_instance = null; 

    private static function getPDOinstance() { 
     if (self::$pdo_instance === null) { 
      try { 
       self::$pdo_instance = new PDO("..."); 
      } catch (PDOException $e) { 
       //... 
      } 
     } 
     return self::$pdo_instance; 
    } 

} 

現在,當您訪問dbFactory::getPDOinstance()你只有使用DB

相關問題