2013-12-18 24 views
2

我很新的PHP OOP的,到目前爲止我使用,我在一個PHP文件提出多個類,如:如何使用多個類在PHP

class Style { 
//stuff 
} 
class User { 
//other stuff 
} 

還有更多,但我有一個關於如何連接到這些類中的MySQL的問題,如果我使用$db = new Mysqli();我將如何能夠從內部類進行查詢?如果我想讓自己的連接器類如下:

class Connection extends mysqli { 
    public function __construct($host, $user, $pass, $db) { 
    parent::__construct($host, $user, $pass, $db); 
    if (mysqli_connect_error()) { 
     die('Connect Error (' . mysqli_connect_errno() . ') ' 
     . mysqli_connect_error()); 
     } 
    }  
} 

如何能夠在不同的類中進行查詢?或者什麼是正確使用oop的更好方法?用多個類來組織代碼的不同部分? 任何幫助或提示將不勝感激,謝謝。怎麼樣使用PDO?這是否使一切變得更容易?

+0

使用類似[Symfony](http://symfony.com/)的框架。他們正是解決了這些問題,所以你可以專注於手頭的任務。 ;-) – nietonfir

+0

PDO是一個具有多個數據庫供應商接口的API。 MySQLi只能訪問MySQL數據庫,但PDO可以訪問MySQLi,MSSQL,SQLite等。它不是常規數據庫驅動程序API的完整版本,但它可以幫助您支持多個供應商,而無需爲每個供應商編寫一個類。 – Crackertastic

回答

6
class Style { 
    public function __construct($conn) { 
     $this->conn = $conn; 
     //use $this->conn in the class 
    } 
} 

$db = new Mysqli(); 
$style = new Style($db); 

我覺得第一個例子是首選的方法,但你可以創建一個簡單的註冊表類,並用它來存儲一個$ db對象等

如果可能的話我可能會使用PDO但沒有按解決不了這個問題。

+0

這是否意味着我將不得不添加連接到我創建的每個類?會有其他方式而不是這樣做嗎?我可以訪問全球? – SuperBeast

+1

我認爲依賴注入是首選的方法,但您可以使用註冊表。 – AbraCadaver

+0

您可以使用global關鍵字來訪問全局數據庫變量,但是一旦項目增長,這不是一個很好的解決方案。使用構造函數將提供更好的控制和可追溯性,並且更容易找到錯誤。 –

-2

使用PDO會給你很多的功能和靈活性,它有許多內置的驅動程序。 做你正在嘗試做的,是一個樣本: STEP 1: 做一個主類,將處理您的數據庫:

class app extends PDO { 
    protected $database_hostname = "localhost"; 
    protected $database_username = "root"; 
    protected $database_password = ""; 
    protected $database_name = "testdb"; 
    protected $database_type = "mysqli"; 

    public function __construct() { 

     try { 
      parent::__construct($this->database_type . ':host=' . $this->database_hostname . ';dbname=' . $this->database_name, $this->database_username, $this->database_password, array(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)); 
     } catch (PDOException $e) { 
      echo 'ERROR: ' . $e->getMessage(); 
     } 
    } 
} 

STEP 2: 那麼你需要initilze一個globale變量作爲你的數據庫:

$db= new app() ; 

步驟3: 包括一個局部變量來處理數據庫中的其他類:

class User{ 
public $db ; 
} 

STEP 4: 在其他類的構造函數(用戶的爲例),你需要通過參考globale變量傳遞的局部變量:

class User{ 
     public $db ; 
     public function __construct(){ 
      global $db; 
      $this->db =& $db; 
     } 
    } 

STEP 5: 然後如果你想執行從類中您可以通過局部變量做一個請求:

$this->db->query("SELECT * FROM user"); 

從外面只需使用:$db->query("SELECT * FROM user");

I H有幫助的ope!

0

由於您正在擴展mysqli類,因此如果您自己實例化該類(只要這些函數不是私有的),就可以像訪問這些函數一樣訪問這些函數。儘管有些人(包括我自己)會用數據庫連接在自己的自定義類中實例化數據庫連接,然後將該類注入需要它的類中。

class MyDatabase { 

    private $this->dbi; 

    public function __construct() {} 

    public function connectDB($host, $user, $pass, $db)) { 
     //You can do this in the constructor too, doesn't have to be its own function 
     $this->dbi = new mysqli($host, $user, $pass, $db); 
    } 

    public function getDBI() { 
     return $this->dbi; 
    } 
} 

您可以將您想要的所有功能添加到您自己的類(或擴展類)中,也可以讓任何需要數據庫擴展您的數據庫類的類。但是這並不是最好的(每個類將有不同的db類/連接)。最簡單的可能是將你的數據庫連接導入你的班級。通過構造函數或其他函數;

class MyClass { 

    private $this->database; 

    public function __construct($db) { 
     $this->database = $db->getDBI(); 
    } 

    public function query($q) { 
     //Of course, clean your data first, and best practices use prepared statements 
     $result = $this->database->query($q); 
     return $result; 
    } 
} 

然後建立數據庫連接並將它注入到類中。

$db = new MyDatabase(); 
$db->connectDB('localhost', 'username', 'password', 'mydb'); 

$class = new MyClass($db); 
$resultSet = $class->query("SELECT * FROM MyTable"); //Obviously anything the user could add here is to not be trusted.