PHP类子修改父级

时间:2014-05-30 15:55:56

标签: php object

我有一个名为db的类,它是与我的数据库相关的各种功能的访问器,例如添加行,验证输入或生成html表单/表格。

我目前必须有db_htmldb_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]);

使用包含数据库架构的单个对象。

但据我所知,创建上述htmlaccess组件仍需要我创建扩展类:

function __construct($name){
  $this->html=new db_html($name);
}

任何后来对一个孩子的属性的修改都不会传播给其他孩子,尽管所有孩子都是"孩子"在类中,他们无法访问他们的" parent"的属性,在这种情况下,它们都是文字父级和容器。

我也有机会把自己包裹起来并变得困惑。解决这个问题的最佳方法是什么?

1 个答案:

答案 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误认为父类。