亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 PHP 7 中的另一個類中使用一個類的實例

如何在 PHP 7 中的另一個類中使用一個類的實例

PHP
紫衣仙女 2023-07-07 10:41:29
我有一個看似簡單的查詢,但我在其他地方沒有找到答案。我有 2 個類,其中一個稱為 DB,它本質上連接到數據庫,然后可以運行查詢。我在文檔頂部實例化它 $db= new DB; 然后我可以在整個頁面上對數據庫運行一系列查詢。我遇到的問題是我想在另一個我稱為 User 的類中使用這個實例。我知道我可以再次實例化,但這沒有意義,或者在實例化 User 時傳遞 DB 實例,例如 $user = new User($db); 但考慮到 $db 實例將被我要創建的大多數類使用,我認為有更好的解決方案將其導入其他類。我查看了全局路線,但我讀到這是不好的做法+我收到意外的全局錯誤class User{    global $db;    public function __construct()    {        var_dump($this-> db);    }//end constructor}//end class
查看完整描述

2 回答

?
MMTTMM

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 ...

? ? }

}


查看完整回答
反對 回復 2023-07-07
?
GCT1015

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();


查看完整回答
反對 回復 2023-07-07
  • 2 回答
  • 0 關注
  • 145 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號