我有一个名为db
的类,它是与我的数据库相关的各种功能的访问器,例如添加行,验证输入或生成html表单/表格。
我目前必须有db_html
,db_valid
等类,这些类扩展了此db
类。这意味着如果我在单个路径中执行多种操作,则会有多个对象。这也意味着我需要编写目标代码:
$db_html=new db_html('table name');
$html=$db_html->make_table();
我在其他API中看到的更多形式是:
$db=new db('table_name');
$html=$db->html->make_table();
然后还允许:
$db->access->insert([data]);
使用包含数据库架构的单个对象。
但据我所知,创建上述html
和access
组件仍需要我创建扩展类:
function __construct($name){
$this->html=new db_html($name);
}
任何后来对一个孩子的属性的修改都不会传播给其他孩子,尽管所有孩子都是"孩子"在类中,他们无法访问他们的" parent"的属性,在这种情况下,它们都是文字父级和容器。
我也有机会把自己包裹起来并变得困惑。解决这个问题的最佳方法是什么?
答案 0 :(得分:0)
Reference a method of container object in PHP?
链接问题中已接受的答案已经很好地回答了这个问题。
您必须修改代码才能提供关系。在OOP中,我们称之为aggregation。
查看有关实例的问题。在我的情况下,我解决了如下:
abstract class db_master {
protected $children=array();
protected $parent;
function __get($name){
if (!isset($this->children[$name])){
$this->add_child($name);
}
return $this->children[$name];
}
function link_parent(&$parent){
$this->parent=$parent;
}
function add_child($name){
$class='db_'.$name;
$child=new $class();
$child->link_parent($this);
$this->children[$name]=&$child;
}
}
因此,如果我在我的图书馆中有这个:
class db extends db_master {
function __construct($name){
}
}
class db_html extends db_master {
function generate(){
}
}
我可以在我的代码中执行此操作:
$db=new db($name);
$html=$db->html->generate();
它可以工作,无需声明子类或进行链接。抽象类可以防止其他人重复使用代码,从而将master误认为父类。