首页 > 解决方案 > OOP/PHP:是否可以为类的每个方法设置默认行为?

问题描述

我正在尝试使用 OOP 模式变得更好。

我有一个为一组数据生成 XML 的类。它对不同的 XML 主体有不同的方法,但每个 XML 都有相同的标头,并且每个方法都需要将 XML 作为字符串返回。

我创建了一个私有函数,它构造标头并返回特定 get 方法根据需要添加她的子节点的 XML 对象。我创建了一个私有函数来美化 XML(如果已设置)并使用默认的“页脚”块将其关闭。

我正在考虑是否有一种模式来优化它并确保 init_xml 和 prepeare_xml 总是在每个公共方法的开始和结束时被调用。是否可以以某种方式构造类,即每个公共方法调用都调用第一个标头方法,并在添加子节点后调用页脚方法?

有一个 get_xml($type, $data) 方法根据 $type 调用特定的 get_?_xml 方法吗?还是有更好的模式?

我希望这个原始示例有意义

class Foo{
  private $xml;

  public function get_bar_xml($data){
    $this->xml = $this->init_xml();

    foreach($data as $key => $value){
      $this->xml->addChild(key, $value);
    }

    return $this->prepare_xml();
  }

  //... set of similar methods following with different
  // child node creation

  private function init_xml(){
    //$this->xml header generation
  }

  private function prepare_xml(){
    //add footer nodes to $this->xml
    //format output if neccesary 

    return $this->xml;
  }
}

标签: phpoop

解决方案


听起来像是Foo一个单例,还是至少只实例化一次然后生成许多 XML 文件?您应该将一个对象实例视为一个 XML 文档:

class Foo {
    protected $xml;

    public function __construct() {
        $this->xml = /* whatever */;
        // add headers
    }

    public function add($data) {
        // write $data to xml
    }

    public function asXML() {
        $this->writeFooter();
        return (string)$this->xml; // or whatever
    }
}

您可以将此作为基类,并让不同类型的文档对其进行扩展,以便仅根据add需要自定义方法。然后它将像这样使用:

$foo = new Foo;
foreach ($data as $d) {
    $foo->add($d);
}
echo $foo->asXML();

如果要创建下一个文档,不要重用$foo,实例化一个new Foo.


推荐阅读