簡體   English   中英

將$ db對象傳遞給其他類,以便它們可以訪問數據庫

[英]Passing $db object to other classes so they can access the database

我有一個PHP數據庫類連接到MySQL並包裝所有的PDO代碼,我用它來查詢數據庫。 基本上在頁面控制器中我創建了一個新對象:

$db = new Database($dbConfig);

然后我可以使用准備好的查詢從數據庫中獲取數據:

$params = array('username' => $username);
$result = $db->preparedSelect('select password, salt from users where username = :username', $params);

它將PDO語句結果復制到新的assoc數組中,並僅將數據庫結果返回給調用頁面。 我用一個簡單的foreach迭代它們,如下所示:

foreach ($result as $key => $val)
{
   $password = $val['password'];
   $salt = $val['salt'];
}

好吧,假設我想讓另一個類使用我的$ db對象,以便它可以在某些方法中訪問數據庫。 目前另一堂課看起來像這樣:

class General
{
    // Database object
    private $db;

    public function __construct($db)
    {
        $this->db = $db;
    }
}

這很好但我只是想知道構造函數應該是這樣的:

public function __construct(&$db)
{
    $this->db = $db;
}

這應該意味着我通過引用傳遞它而不是將對象復制到另一個類中。 我不想在類中使用$ db對象的副本,我希望它使用現有的數據庫對象,所以我沒有多個副本使用內存浮動。

在以$ db或&$ db傳遞它之間PHP5有什么區別嗎? 從做一些閱讀來看,PHP5默認情況下通過引用傳遞對象,而其他人現在說這是以Java方式進行的,有些人說使用&進行硬連接。 我糊塗了。 最好的方法是什么?

非常感謝!

有一點不同,但你可能認為並不是真正的差異。

在PHP5中,持有對象的“$ db”基本上等同於C或C ++中的“Foo *”。 換句話說,$ db不存儲整個對象,它只存儲一個小令牌,讓代碼在必要時找到對象。 按值傳遞此標記時,它與傳遞整數值而不是整個對象的副本一樣快。 但是如果分配$ db,它不會更改調用者中的值,因為您正在更改包含令牌以包含其他令牌的本地變量。

如果函數采用“&$ db”,那基本上相當於在C中傳遞“Foo **”,或者更准確地說是在C ++中傳遞“Foo *&”的函數。 調用同樣快,因為它與傳遞的大小相同,但如果你分配給$ db,它會在調用者中更改$ db的值,因為“按引用傳遞”變量指向內存將令牌保留在呼叫者中的位置。

最好的方法是傳遞價值(不要使用“&”),除非你知道自己在做什么以及為什么要這樣做。

這是個好問題。

您始終可以通過打開$ db句柄,將其傳遞給函數,並通過===運算符檢查它們來確保它們是同一個對象來進行測試。

這對於靜態方法來說是一個很好的工作。 這就是有多少框架完成相同的任務。

class DB
{
   private static $db = FALSE:

   public static function init($dbConfig)
   {
      if(! self:$db)
      {
         self::$db = new Database($dbConfig);
      }
   }

   public static function preparedSelect($sql, $params)
   {
      if(! self::$db)
      {
         die("call the init method first");
      }

      // db stuff, where you would call $this->db call self::$db
   }
}

因此,在您要調用數據庫的其他類中,您所要做的就是:

class General
{
   public function __construct()
   {
      DB::init($dbConfig);
   }

   public function someMethod()
   {
      $params = array('username' => $username);
      $result = DB::preparedSelect('select password, salt from users where username = :username', $params);

   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM