【问题标题】:Changing a parent class to a child class depending on constructor parameters根据构造函数参数将父类更改为子类
【发布时间】:2019-03-15 16:28:30
【问题描述】:

我有一个数据库类,您可以在其中将表名传递给构造函数,如下所示:

$customer =  new Dao("customer");

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

class customerDao extends Dao{}

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

我的目标是允许Dao 类用于大多数表,但如果表匹配它们,则强制程序员使用这些子类之一。我想确保如果有人创建 Dao 类的对象并传入与这些子类之一对应的表名,它将实例化子类,这样就不可能插入客户预先运行此逻辑代码。有没有办法做到这一点?

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

【问题讨论】:

  • 我会改变你实例化这些类的方式。我会创建某种包装器/工厂,根据参数决定要实例化的类。这个工厂可以检查这个自定义类是否存在并返回和实例。不幸的是,“强迫”程序员这不是获得优雅解决方案的最佳方式。
  • 只是想知道我的回答是否有帮助?
  • @miken32 是的。在将其标记为已接受的答案之前,我只是在等着看是否还有其他答案或方法。谢谢!

标签: php class oop object inheritance


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-10-17
    • 2017-05-28
    • 2014-08-11
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多