2011-06-10 154 views
0

我已創建三類。一類是從PDO擴展的db。其他兩個類從db類擴展。但問題是當我初始化這些子類的對象時,第二個對象被創建爲第一個對象的克隆。預先感謝您的幫助。錯誤時PDO類擴展

<?php 
/** The Database Driver */ 
define('DB_DRIVER', 'mysql'); 

/** The name of the database */ 
define('DB_NAME', 'sample'); 

/** MySQL database username */ 
define('DB_USER', 'root'); 

/** MySQL database password */ 
define('DB_PASSWORD', 'root'); 

/** MySQL hostname */ 
define('DB_HOST', 'localhost'); 

class db extends PDO 
{ 
    public function __construct() 
    { 
     echo "DB constructor called\n"; 
     $options = array(
      PDO::ATTR_PERSISTENT => true, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
     ); 
     $dsn = DB_DRIVER . ":host=" . DB_HOST . ";dbname=" . DB_NAME; 
     parent::__construct($dsn, DB_USER, DB_PASSWORD, $options); 
    } 
} 

class Admin extends db 
{ 
    private $uid, $username, $password, $level, $name, $email; 

    public function __construct() 
    { 
     echo "Admin constructor called\n"; 
     parent::__construct(); 
    } 
} 

class Movie extends db 
{ 
    private $mid, $title, $slug; 

    public function __construct() 
    { 
     echo "Movie constructor called\n"; 
     parent::__construct(); 
    } 
} 


$adminObj = new Admin(); 
$movieObj = new Movie(); 
var_dump($adminObj); 
var_dump($movieObj); 
?> 

下面是上述的輸出。 請注意輸出中顯示的對象類型

Admin constructor called 
DB constructor called 
Movie constructor called 
DB constructor called 
object(Admin)#1 (6) { 
    ["uid":"Admin":private]=> 
    NULL 
    ["username":"Admin":private]=> 
    NULL 
    ["password":"Admin":private]=> 
    NULL 
    ["level":"Admin":private]=> 
    NULL 
    ["name":"Admin":private]=> 
    NULL 
    ["email":"Admin":private]=> 
    NULL 
} 
object(Admin)#2 (6) { 
    ["uid":"Admin":private]=> 
    NULL 
    ["username":"Admin":private]=> 
    NULL 
    ["password":"Admin":private]=> 
    NULL 
    ["level":"Admin":private]=> 
    NULL 
    ["name":"Admin":private]=> 
    NULL 
    ["email":"Admin":private]=> 
    NULL 

}


當父:: __構建體($ DSN,DB_USER,DB_PASSWORD,$選項);在db類中被刪除的問題會消失。

+0

如果您不滿意提出的方案和需要持久連接,那麼(好,我會建議它在任何情況下)根本不延長PDO和創建'db'類中PDO實例,而不是或通行PDO實例作爲Admin/Movie類構造函數的參數。 – LazyOne 2011-06-10 18:55:16

回答

1

你有PDO::ATTR_PERSISTENT => true,,你正試圖創建2 PDO使用相同的DSN字符串對象。這告訴PDO在您執行$movieObj = new Movie();而不是創建新連接時返回已建立的連接。

解決你的情況: PDO::ATTR_PERSISTENT => false,

有用的鏈接:Connections and Connection management

當父:: __構造($ DSN, DB_USER,DB_PASSWORD,$選項);在 DB類被刪除的問題將 消失。 是的,因爲在這種情況下不會創建實際的PDO對象。

+0

雖然這是一個正確的答案,但它只適用於PHP錯誤。這將導致每個對象有一個連接是浪費,並且會阻止跨請求使用任何持久連接(這可能是需要的)。 – Matthew 2011-06-10 18:27:48

+0

我完全同意「持續連接」的東西。最好的辦法不是擴展PDO **,而是直接使用PDO(作爲db處理程序),並且將db類聲明爲不帶「extends」(例如'class db {...}') PDO對象作爲類字段(在__construct()中創建或作爲參數傳遞等)。 – LazyOne 2011-06-10 18:38:48

0

首先,這看起來像一個錯誤,這可能是由於PDO類在內部處理持久連接的方式。也就是說,PHP不應該返回錯誤的擴展類,但可能是因爲核心PDO驅動程序沒有設計用於擴展它。

我搜索上bugs.php.net錯誤,並有部分上市。 (例如,搜索「pdo extend persistent」)請參閱#47407以瞭解類似的內容。

所有這一切說,好像你一個不好的設計。你的班應該採取句柄到現有的PDO對象:

$db = new DB(); 
$movie = new Movie($db); 

這將解決此PHP錯誤,但同樣重要的是......這是更好的設計。

+0

我想這不是一個錯誤,而是看看[這個解釋](http://www.selfcontained。美國/ 2011/04/20/PHP-和一個抽象-單/)。 – hornetbzz 2011-07-08 05:41:22