2 回答

TA貢獻1869條經驗 獲得超4個贊
由于您的數據庫客戶端將被實例化一次,然后在其他地方使用,我最初的想法是建議將其作為構造函數參數傳遞(依賴注入),但由于您不喜歡這種方法,所以我建議將您的數據庫客戶端設置為單例類,這意味著它只能實例化一次,任何后續嘗試都將在各處返回相同的實例。
作為一個簡單的示例,您的數據庫將類似于以下內容:
final class DB
{
? ? public static function getInstance()
? ? {
? ? ? ? static $inst = null;
? ? ? ? if ($inst === null) {
? ? ? ? ? ? $inst = new self();
? ? ? ? }
? ? ? ? return $inst;
? ? }
? ? private function __construct()
? ? {
? ? ? ? // your code here ...
? ? }
? ? // your code here ...
}
然后,在您的 User 類上,您將獲得 DB 類實例:
class User {
? ? // your code here ...
? ? public function doSomething() {
? ? ? ? $db = DB::getInstance();
? ? ? ? // your code here ...
? ? }
}

TA貢獻1827條經驗 獲得超4個贊
PHP 不像 Javascript 那樣處理范圍,你的 $db 是未定義的。
變量的作用域是定義它的上下文。大多數情況下,所有 PHP 變量都只有一個作用域。這個單一作用域也涵蓋了包含的文件和必需的文件[…]在用戶定義的函數中引入了本地函數作用域。默認情況下,函數內使用的任何變量都僅限于本地函數范圍。
這意味著 PHP 中只有全局作用域和函數/方法作用域。因此,要么將 $db 實例作為協作者傳遞到方法中
class User{
? ? public function __construct() {}
? ? public function getInfo(Database $db) {
? ? ? ? $db->query( /* ... */ );
? ? }
}
$user = new User();
$db = new Database();
$user->getInfo($db);
或將其傳遞到構造函數中(依賴注入)
class User{
? ? private $db;
? ? public function __construct(Database $db)
? ? {
? ? ? ? $this->db = $db;
? ? }
? ? public function getInfo() {
? ? ? ? $this->db->query( /* ... */);
? ? }
}
$db = new Database();
$user = new User($db);
$user->getInfo();
- 2 回答
- 0 關注
- 145 瀏覽
添加回答
舉報