我对OOP的想法很新,并且仍然对某些概念感到困惑。我已经编写了这个脚本来练习OOP,但我对这个脚本非常怀疑,因为我觉得我正在“发明”一种使用OOP的新方法,我从未见过别人这样做。
我的情况:我在form.php
中有一个很长的<form>
,当提交Encode
时,需要处理一些数据(数组)/在存储到db之前以某种方式编码。从db中检索这些数据时,我需要在输出到浏览器之前解析编码数据。
所以我决定将此脚本中“处理数据的方式”分为3个组成部分:Decode
,Query
,class.php
,进入一个班级。
现在我的class Encode {}
class Decode {}
class Query {}
包含3个类:
class Form {
private $encode;
private $decode;
private $query;
public function __construct()
{
// instantiate the 3 other classes and store them into properties
}
public function encode()
{
return $this->encode;
}
}
然后我觉得我想将所有三个班级组合成一个班级,所以我创建了:
$form = new Form()
$form->encode()->someMethod();
我称之为:
{{1}}
所以我的问题是我是在正确的轨道上还是我是否违反了有关OOP的一些基本原则?
如果你能指出我误解OOP的地方会很棒,谢谢。
答案 0 :(得分:1)
在我看来,数据的编码和解码与表单无关。你甚至在你的问题上提到它:
某些数据(数组)需要以某种方式处理/编码才能存入 db
因此,编码应该在数据库层进行,至少不是在表单层。
同样从您的示例中,您将通过Form
对象到达最终使用某些编码器对象的内容:
$form->encode()->someMethod();
为什么需要从外面 Form
访问编码器?
最后,您还在Form
构造函数的评论中说明了// instantiate the 3 other classes and store them into properties
。我不会那样做。因为它引入了其他3个类和事物之间的紧密耦合(在Form
的情况下)你实例化它。使你的代码更难调试和维护,引入隐藏的依赖项(我看不到它使用ef {{1通过查看方法签名)并使您的代码更难以测试。
以上内容的示例:
Encoder
这样,表单不必知道有关编码/解码数据的目的(存储和检索来自数据库的数据),它不负责。
你已经将编码器/解码器从类中解耦,使你的代码更加合理和可测试。
答案 1 :(得分:0)
试试此代码
class Form {
private $encode;
private $decode;
private $query;
public function __construct(Encode $encode, Decode $decode, Query $query)
{
$this->encode = $encode;
$this->decode = $decode;
$this->query = $query
}
public function encode()
{
return $this->encode;
}
}
$form = new Form(new Encode, new Decode, new Query)
$form->encode->someMethod();