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


PHP object inheritage from class constructor - the right way

我需要一些关于 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 方法。我看到它的方式是不可传递的,因为我希望我的数据库类继承类构造函数中的另一个类。

我希望有人能给我一个建议,告诉我如何做到这一点......让我们说......正确的方式。

谢谢。

nonono,这不是oop思维。你应该谷歌以下关键词:

  • 首选组合而不是继承
  • 策略模式
  • 构造函数注入
  • 首选接口而不是基类
  • 单一责任原则
  • 某种工厂模式

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

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

使用单例模式,创建一个名为 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道歉,因为他没有检查他的答案是正确的。