php - 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;
}
}
解决方案
听起来像是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
.
推荐阅读
- c++ - 使用堆栈和中序遍历检查 Tree 是否为 BST
- ios - 如何在swift 5中为表格视图单元格添加滑动操作
- arguments - 在 Lisp/Racket/Scheme 中,怎么可能有一个名为 `list` 的参数?
- javascript - Laravel 侧边栏导航链接不起作用
- laravel - 使用 laravel 在插入之前检查记录是否存在
- sql - 替代 SAFE_OFFSET 从 SQL 中的数组中提取信息?
- scikit-learn - 加快 SVM 评分中的交叉验证
- reactjs - React 语义 UI 表显示和隐藏列
- c# - 如何使用 src 属性在 html 中打开安全 url
- python - PySyft Worker 过拟合