2 回答

TA貢獻1869條經驗 獲得超4個贊
由于您的數(shù)據(jù)庫客戶端將被實例化一次,然后在其他地方使用,我最初的想法是建議將其作為構造函數(shù)參數(shù)傳遞(依賴注入),但由于您不喜歡這種方法,所以我建議將您的數(shù)據(jù)庫客戶端設置為單例類,這意味著它只能實例化一次,任何后續(xù)嘗試都將在各處返回相同的實例。
作為一個簡單的示例,您的數(shù)據(jù)庫將類似于以下內容:
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 是未定義的。
變量的作用域是定義它的上下文。大多數(shù)情況下,所有 PHP 變量都只有一個作用域。這個單一作用域也涵蓋了包含的文件和必需的文件[…]在用戶定義的函數(shù)中引入了本地函數(shù)作用域。默認情況下,函數(shù)內使用的任何變量都僅限于本地函數(shù)范圍。
這意味著 PHP 中只有全局作用域和函數(shù)/方法作用域。因此,要么將 $db 實例作為協(xié)作者傳遞到方法中
class User{
? ? public function __construct() {}
? ? public function getInfo(Database $db) {
? ? ? ? $db->query( /* ... */ );
? ? }
}
$user = new User();
$db = new Database();
$user->getInfo($db);
或將其傳遞到構造函數(shù)中(依賴注入)
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 關注
- 151 瀏覽
添加回答
舉報