-------现在,另一个问题,任何人都可以解释一下吗?
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 :(得分: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的回答。