我需要一些关于 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道歉,因为他没有检查他的答案是正确的。