2010-07-15 17 views
0

-------現在,另一個問題,任何人都可以解釋嗎?DBFactory,只能使用靜態

class DBFactory { 
       static function create(){ 
       return new MysqlDB(); 
     } 
    } 
class MysqlDB{ 
    function alo(){ 
     echo 'ok'; 
     } 
} 
$db = DBFactory::create(); 
$db->alo(); 

--->作品

class DBFactory { 
       function create(){ 
       return new MysqlDB(); 
     } 
    } 
class MysqlDB{ 
    function alo(){ 
     echo 'ok'; 
     } 
} 
$db = new DBFactory; 
$db->create(); 
$db->alo();  

--->不工作

+0

致命錯誤:在第14行調用未定義的方法DBFactory :: alo()* * 第14行:'$ db-> alo(); ' – Snoob 2010-07-15 08:55:42

回答

0

因爲你返回MysqlDB實例,但沒有在任何地方保存參考。 DBFactory沒有alo方法。比較:

$db = new DBFactory; 
$mysqlDb = $db->create(); 
$mysqlDb->alo(); 
+0

謝謝,我明白了 – Snoob 2010-07-15 09:08:26

0

DBFactory沒有一個方法alo,不是嗎?

這會工作:

$dbFactory = new DBFactory; 
$db = $dbFactory->create(); 
$db->alo(); 
+0

'第2行未定義變量:$ db'; P – deceze 2010-07-15 08:57:11

+0

@deceze argh,已更正:) – 2010-07-15 08:59:12

0

DbFactory正在返回一個對象,而不是內部分配它!

class DBFactory 
{ 
    function create(){ 
     return new MysqlDB(); 
    } 
} 
class MysqlDB 
{ 
    function alo() 
    { 
     echo 'ok'; 
    } 
} 
$db = new DBFactory; 
$Database = $db->create(); 
$Database->alo(); 
如果你想保持它就像在同一個對象

然後做

class DBFactory 
{ 
    var $DB; 
    function DBFactory() 
    { 
     $this->DB = new MysqlDB(); 
    } 
    function __call($name,$arguments) 
    { 
     return call_user_func_array(array($this->DB,$name),$arguments); 
    } 
} 
class MysqlDB 
{ 
    function alo() 
    { 
     echo 'ok'; 
    } 
} 
$db = new DBFactory; 
$db->alo(); 
0

工廠通常abstract,因此不能被實例化。他們有一個或多個爲您創建對象的靜態方法。所以沒有需要來實例化一個工廠。 (靜態)create()方法返回MysqlDB的一個實例,你只是調用方法而不把結果賦值給一個變量,所以它只是'丟失'。

有關具體解決方案,請參閱@ deceze的答案。

相關問題