我有一个数据库类,您可以在其中将表名传递给构造函数,就像这样:
$customer = new Dao("customer");
对于一些具有特殊行为的表,还有专门的子类,例如:
class customerDao extends Dao{}
这样做的原因是,如果有人要插入客户,则我希望每次都预先确定某些逻辑。
我的目标是允许Dao
类用于大多数表,但是如果表与它们匹配,则强制程序员使用这些子类之一。我想确保如果有人创建Dao
类的对象并传递与这些子类之一相对应的表名,则它将实例化该子类,从而无法插入客户无需事先运行此逻辑代码。有办法吗?
如果必须的话,我可以只拥有一组禁止使用的表名,并在构造函数中检查匹配项,但是我希望找到一个更优雅的解决方案。
答案 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