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