![](/img/trans.png)
[英]Passing an Object between PHP pages, IDE and passing object to other classes problems
[英]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.