PHP对象从类构造函数继承 - 正确的方法

时间:2013-02-02 12:31:52

标签: php class inheritance

我需要一些关于php对象继承情况的指导。 我有: 一个配置对象,如:

configuration{
    var driver = 'mysql'; // or 'mssql';
    var host = 'database_host';
    var user = 'database_user';
    var password = 'database_password';
    var name = 'database_name';
}

两个数据库处理程序类:

class mysql{
    public mysql(){} // connect
    public query(){} // set a query
    public result(){} // load result
}

class mssql{
    public mysql(){} // connect
    public query(){} // set a query
    public result(){} // load result
}

和某种类控制器:

class database{
    public function __construct(){
        $configuration = new configuration;
        /*
         * now, depending on the value of the $configuration->driver
         * my database class must inherit methods from mysql or mssql class
         */
        switch( $configuration->driver ){
            case 'mysql':
                // database inherit mysql methods
            break;
            case 'mssql':
            // database inherit mssql methods
            break;
        }
    }
}

用法如:

$database = new database;
$database->query( 'select * from some_table' );
$result = $database->result();

所以,当我使用数据库类方法时,根据配置对象,我实际使用 mysql mssql 方法。 我认为它的方式是不可行的,因为我希望我的数据库类继承类构造函数中的另一个类。

我希望有人可以给我一个关于我该怎么做的建议..让我们说......正确的方法。

感谢。

2 个答案:

答案 0 :(得分:1)

nonono,这不是oop-thinking。你应该谷歌以下关键字:

当你这样做时,将switch语句放入工厂,使mysql类成为名为 DBDriver 的接口,并在数据库类中使用策略模式。

答案 1 :(得分:0)

如果某人像我一样迷茫,读了这篇文章,这就是我找到的解决方案(经过数周的研究 - 是的,几周之后):

使用单例模式,创建一个名为database的父类:

class database{
    protected static $instances = array();

    // method to create a new instance of this object
    public function getInstance( $driver ){
        $instanceid = md5( $driver );

        if( self::$instances[ $instanceid ] == null ){
            self::$instances[ $instanceid ] = new $driver;
        }

        return self::$instances[ $instanceid ];
    }

    public function testFunction(){
        //do something else
    }
}

然后创建驱动程序函数

class mysql extends database{
    public mysql(){} // connect
    public query(){} // set a query
    public result(){} // load result
}

class mssql extends database{
    public mysql(){} // connect
    public query(){} // set a query
    public result(){} // load result
}

现在像

一样使用它
$database = database::getInstance( 'mysql' );
$database->query(); // works
$database->testFunction(); // works to

进一步你可以使用和喜欢

$database = database::getInstance( 'mssql' );
$database->query(); // works
$database->testFunction(); // works to

我需要向Froncoise道歉,因为他的答案是正确的。