结合其他相关课程的中心课程

时间:2016-12-14 08:55:30

标签: php oop

我对OOP的想法很新,并且仍然对某些概念感到困惑。我已经编写了这个脚本来练习OOP,但我对这个脚本非常怀疑,因为我觉得我正在“发明”一种使用OOP的新方法,我从未见过别人这样做。

我的情况:我在form.php中有一个很长的<form>,当提交Encode时,需要处理一些数据(数组)/在存储到db之前以某种方式编码。从db中检索这些数据时,我需要在输出到浏览器之前解析编码数据。

所以我决定将此脚本中“处理数据的方式”分为3个组成部分:DecodeQueryclass.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的地方会很棒,谢谢。

2 个答案:

答案 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();