0

php中有什么方法可以确保一个类可以扩展一个且只有一个类?

我有一些代码来说明我正在尝试做的事情,基本上我有一个数据库管理器类和一个由管理器类扩展的数据库查询类。我想做的是确保数据库查询类只能由数据库管理器类使用。

下面的代码有效,但看起来很粗糙。在代码中,我使用一个检查类名的抽象函数来删除查询类抽象,或者我可以简单地将所有 Manager 函数声明为查询类中的抽象(这看起来很hacky)。如果有比我下面的代码更简单的方法来做到这一点,那将非常有用......

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 }

}
4

2 回答 2

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 类指令。

http://php.net/manual/en/language.oop5.final.php

于 2013-08-21T12:18:36.790 回答
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();
    }

}
于 2013-08-21T16:09:01.643 回答