根据构造函数参数将父类更改为子类

时间:2018-10-10 17:21:21

标签: php class oop object inheritance

我有一个数据库类,您可以在其中将表名传递给构造函数,就像这样:

$customer =  new Dao("customer");

对于一些具有特殊行为的表,还有专门的子类,例如:

class customerDao extends Dao{}

这样做的原因是,如果有人要插入客户,则我希望每次都预先确定某些逻辑。

我的目标是允许Dao类用于大多数表,但是如果表与它们匹配,则强制程序员使用这些子类之一。我想确保如果有人创建Dao类的对象并传递与这些子类之一相对应的表名,则它将实例化该子类,从而无法插入客户无需事先运行此逻辑代码。有办法吗?

如果必须的话,我可以只拥有一组禁止使用的表名,并在构造函数中检查匹配项,但是我希望找到一个更优雅的解决方案。

1 个答案:

答案 0 :(得分:1)

由于__construct()不能返回任何内容,因此,我认为唯一可行的方法是使用静态方法而非new进行创建。您可以动态检查类的存在,以免保留此类列表及其表名的列表。

class Dao {
    public $table;
    public function __construct($table) { $this->table = $table; }
    public function whatami() { echo get_class($this) . "\n"; }
    public function gettable() { echo "$this->table\n"; }
    public static function create($table) {
        $cn = "${table}Dao";
        return class_exists($cn) ? new $cn() : new Dao($table);
    }
}

class customerDao extends Dao {
    public function __construct() { $this->table = "customer"; }
}

$foo = Dao::create("foo");
$foo->whatami();
$foo->gettable();
$bar = Dao::create("customer");
$bar->whatami();
$bar->gettable();

输出:

Dao
foo
customerDao
customer