我是很新的面向對象,我有一個快速的問題:如何在其他類中調用類?
我有我的代碼中使用以下類別:
Class DB {
//contains all my mysqli stuff
}
Class A {
All functions within this class will need a db connection
}
如何創建,而無需創建類內部的連接每個函數都有一個新的數據庫實例?
這甚至可能嗎?
在此先感謝。
我是很新的面向對象,我有一個快速的問題:如何在其他類中調用類?
我有我的代碼中使用以下類別:
Class DB {
//contains all my mysqli stuff
}
Class A {
All functions within this class will need a db connection
}
如何創建,而無需創建類內部的連接每個函數都有一個新的數據庫實例?
這甚至可能嗎?
在此先感謝。
對於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
閱讀材料:
有一堆答案在這裏,在技術上回答這個問題,但他們都教不正確的做法。良好的面向對象設計的一大部分是贊成構造而不是繼承。
如果您的A
類是需要與數據庫一起工作的模型,那麼讓該類擴展爲DB
是一個非常糟糕的主意。相反,你只是想傳遞DB
到A
的構造:
class A {
protected $db;
function __construct(DB $db) {
$this->db = $db;
}
}
現在A
每個方法都可以通過$this->db
訪問DB
。
這也解決了其開放的A
每個實例很多數據庫連接的問題(或將來,如果你需要一個B
或C
類)。
A
本身不應該創建自己的DB
實例,但這應該不是得到通過注入無論構建A.這就是所謂的依賴注入和良好的面向對象設計的另一個原則。
爲什麼不使用'__construct()'函數? – Blueblazer172
關於你的數據庫類,我想下面的閱讀對你有用:[你的第一個數據庫包裝的兒童疾病](https://phpdelusions.net/pdo/common_mistakes) –