0

我需要一些关于 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();

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

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

谢谢。

4

2 回答 2

1

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

完成后,将 switch 语句放入工厂,使类 mysql 成为名为DBDriver的接口,并在数据库类中使用策略模式。

于 2013-02-05T14:51:17.770 回答
0

如果有人像我一样困惑,阅读这篇文章,这就是我找到的解决方案(经过数周的研究 - 是的,数周后):

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

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 道歉,因为我取消了他的正确答案。

于 2013-03-04T18:42:38.483 回答