2016-12-07 89 views
1

我是很新的面向對象,我有一個快速的問題:如何在其他類中調用類?

我有我的代碼中使用以下類別:

Class DB { 
//contains all my mysqli stuff 
} 

Class A { 
All functions within this class will need a db connection 
} 

如何創建,而無需創建類內部的連接每個函數都有一個新的數據庫實例?

這甚至可能嗎?

在此先感謝。

+1

爲什麼不使用'__construct()'函數? – Blueblazer172

+0

關於你的數據庫類,我想下面的閱讀對你有用:[你的第一個數據庫包裝的兒童疾病](https://phpdelusions.net/pdo/common_mistakes) –

回答

-2

對於class DB,您可以設置您的數據庫連接,例如打開&關閉。對於class A,您可以使用extends將該類設置爲繼承class DB的方法。由於您不需要從外部訪問您的班級,因此我已將class DB中的方法(程序中的功能)更改爲protected,因爲在PHP中默認情況下所有方法都是public

我還添加了Constructor(如註釋中所述)的用法,因此當從Class A創建對象時,您的數據庫連接將自動打開。就個人而言,我不會在構造函數中打開數據庫連接,但這只是我偏執狂。如果您有疑問,只要確保您關閉了方法中的連接。

<?php 

Class DB { 

    protected function conDB() { //Protected can only be accessed by same class or inherited class 

     echo "Open connection to DB"; 

    } 

    protected function closeDB() { //Protected can only be accessed by same class or inherited class 

     echo "Connection Closed"; 

    } 

} 

Class A extends DB { //Extends will use all methods from inherited class 

    function __construct() { //Constructer will run on Object creation and open connection to DB 

     $this->conDB(); 

    } 


    public function selectDB() { 

     echo "<br>"; 
     echo "Data Select Here!"; 
     echo "<br>"; 
     $this->closeDB(); //You will still need to close the DB Connection 

    } 

} 

從類創建對象

$select = new A(); //Create Object 
$select->selectDB(); 

輸出調用類

Open connection to DB 
Data Select Here! 
Connection Closed 

閱讀材料:

0

有一堆答案在這裏,在技術上回答這個問題,但他們都教不正確的做法。良好的面向對象設計的一大部分是贊成構造而不是繼承。

如果您的A類是需要與數據庫一起工作的模型,那麼讓該類擴展爲DB是一個非常糟糕的主意。相反,你只是想傳遞DBA的構造:

class A { 

    protected $db; 

    function __construct(DB $db) { 

     $this->db = $db; 

    } 

} 

現在A每個方法都可以通過$this->db訪問DB

這也解決了其開放的A每個實例很多數據庫連接的問題(或將來,如果你需要一個BC類)。

A本身不應該創建自己的DB實例,但這應該不是得到通過注入無論構建A.這就是所謂的依賴注入和良好的面向對象設計的另一個原則。

+0

而不是徹頭徹尾的說「這真是一個壞主意」和downvoting,對你來說,爲什麼'extend'不正確,所以我們都可以學習。真的只是一個想法。另外,不要忘記... OP是相當新的面向對象,使用可視性如'extends'是學習的關鍵。 – Kitson88

+0

@ Kitson88數據庫訪問是一個非常特殊的情況。 –

+0

@ Kitson88瞭解'extend'非常重要,我同意。但是,像這樣的任何問題的默認工具應該是組合的,並且只有當它絕對有意義時才延伸。如果您想了解更多,請查看SOLID設計並搜索術語「合成繼承」。這應該是一個非常好的谷歌關鍵字。 – Evert

相關問題