DBFactory,只能使用静态

时间:2010-07-15 08:51:27

标签: php oop

-------现在,另一个问题,任何人都可以解释一下吗?

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();    

--->不起作用

4 个答案:

答案 0 :(得分:0)

DBFactory没有方法alo,是吗?

这样可行:

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

答案 1 :(得分:0)

因为您返回新的MysqlDB实例,但未在任何地方保存引用。 DBFactory没有alo方法。比较:

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

答案 2 :(得分: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();

答案 3 :(得分:0)

工厂通常是abstract,因此无法实例化。它们有一个或多个静态方法,可以为您创建对象。因此,没有需要来实例化工厂。

(static)create()方法返回一个MysqlDB实例,你只是调用方法而不将结果赋给变量,所以它只是“丢失”。

有关具体解决方案,请参阅@ deceze的回答。