2010-07-15 63 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的答案。

相关问题