在PHP中是否有任何方法可以确保一个类可以只扩展一个类?
我有一些代码说明我正在尝试做什么,基本上我有一个DB管理器类和一个由manager类扩展的DB查询类。我想要做的是确保DB查询类只能由DB管理器类使用。
下面的代码有效,但看起来非常粗糙。在代码中,我使用单个抽象函数来检查查询类摘要,该抽象函数检查类名,或者我可以简单地将所有Manager函数声明为查询类中的抽象(这看起来很简陋)。如果有一种比我下面的代码更简单的方法,那将是非常有用的......
abstract class DB_Query {
private static $HOST = 'localhost';
private static $USERNAME = 'guest';
private static $PASSWORD = 'password';
private static $DATABASE = 'APP';
//////////
/* USING ABSTRACT FUNCTION HERE TO ENFORCE CHILD TYPE */
abstract function isDB();
/* OR USING ALTERNATE ABSTRACT TO ENFORE CHILD TYPE */
abstract function connect();
abstract function findConnection();
abstract function getParamArray();
//////////
private function __construct() { return $this->Connect(); }
public function Read($sql) { //implementation here }
public function Query($sql) { //implementation here }
public function Fetch($res, $type='row', $single='true') { //implementation here }
}
class DB extends DB_Query {
public $connections = array();
public static $instance;
public function isDB() {
if (get_parent_class() === 'Database' && get_class($this)!=='DB') {
throw new \Exception('This class can\'t extend the Database class');
}
}
public function connect($host=null,$user=null,$pass=null,$db=null) { //implementation here }
function findConnection($user, $password=null) { //implementation here }
public function getParamArray($param) {}
public function threadList() {}
public function getThread($threadId=null) {}
public static function Singleton() { //implementation here }
private function __construct() { //implementation here }
}
答案 0 :(得分:2)
我会将DB_Query的构造函数标记为 final ,并以检查实例并触发某些异常的方式实现它。像这样的东西
class Base {
final function __construct() {
if (!$this instanceof Base && !$this instanceof TheChosenOne) {
throw new RuntimeException("Only TheChosenOne can inherit Base");
}
/**
* use this function as constructor
*/
$this->__internal_base_construct();
}
protected function __internal_base_construct() {
// constructor code
}
}
但是你的问题很奇怪,并且在几个方面打破了OOP的想法。只需将它组合成一个类并使用 final class 指令。
答案 1 :(得分:0)
class Database_Query extends Database {
public static $instance;
public function Query($sql) {}
public function Fetch($res, $type='row', $single='true') {}
public static function Singleton() {}
private function __construct() {
$this->link = $this->connect()->find('guest')->getLink();
}
}