OOP/PHP:一个类的每个方法都可能有默认行为吗?

OOP/PHP:一个类的每个方法都可能有默认行为吗?,php,oop,Php,Oop,我正在尝试更好地使用OOP模式 我有一个为一组数据生成XML的类。对于不同的XML体,它有不同的方法,但是每个XML都有相同的头,每个方法都需要以字符串的形式返回XML 我制作了一个私有函数,它构造了头并返回XML对象,特定的get方法根据需要在其中添加她的子节点。我已经创建了一个私有函数,用于美化XML(如果已设置),并使用默认的“footer”块将其关闭 我正在考虑是否有一种模式来优化它,并确保init_xml和prepeare_xml总是在每个公共方法的开始和结束时被调用。是否可以以这样的

我正在尝试更好地使用OOP模式

我有一个为一组数据生成XML的类。对于不同的XML体,它有不同的方法,但是每个XML都有相同的头,每个方法都需要以字符串的形式返回XML

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

我正在考虑是否有一种模式来优化它,并确保init_xml和prepeare_xml总是在每个公共方法的开始和结束时被调用。是否可以以这样的方式构造类:每个公共方法调用调用第一个header方法,在添加子节点之后调用第二个footer方法

是否有一个get_xml($type,$data)方法根据$type调用特定的get_?\u 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;
  }
}

听起来像是
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
,实例化一个
新的foo

听起来像
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
,实例化一个
新foo

好的,我刚刚注意到我的示例中有一个错误。因为xml总是相同的,所以我不能再对不同的xml使用相同的对象(如果这是Signleton的意思的话)。但是我想可以通过使用$output=$this->xml清理asXML方法中的xml来解决这个问题$这->xml=“”$此->创建_头();返回$output;或者什么的,对吧?嗯,不,可能恰恰相反。您似乎只需要执行一次
newfoo
,然后用它生成多个不同的XML文档,对吗?这是一个单例(=仅类的一个实例)。如果你愿意的话,我建议它是一个单一用途的对象;为要生成的每个文档实例化一个新对象。这是更简单的代码和更面向对象的编程。好吧,我刚刚注意到我的示例中出现了一个错误。因为xml总是相同的,所以我不能再对不同的xml使用相同的对象(如果这是Signleton的意思的话)。但是我想可以通过使用$output=$this->xml清理asXML方法中的xml来解决这个问题$这->xml=“”$此->创建_头();返回$output;或者什么的,对吧?嗯,不,可能恰恰相反。您似乎只需要执行一次
newfoo
,然后用它生成多个不同的XML文档,对吗?这是一个单例(=仅类的一个实例)。如果你愿意的话,我建议它是一个单一用途的对象;为要生成的每个文档实例化一个新对象。这是更简单的代码和更多的OOP。