【问题标题】:Data Encapsulation and Data Flow in PHPPHP中的数据封装和数据流
【发布时间】:2012-02-25 08:58:02
【问题描述】:

我正在重建一个我运行的提供潮汐表的网站。我正在使用 Zend 框架来做这件事,并试图使其尽可能面向对象。我一直在思考当访问者从某个位置请求潮汐表时会发生的流程/过程以及它如何返回。

我想出了 2 种不同“类型”的对象来帮助完成这个过程。第一个基本上是 Zend Framework 使用的 helper 对象。第二个是一个 data 对象(因为没有更好的词)来封装在助手之间传递的数据。这是我正在考虑的流程的粗略概念:

  • 请求处理程序
    • 接收来自站点控制器或 api 控制器的请求数组。
    • 创建名为 QueryData 的“数据对象”并使用有关请求的所有信息填充它。
    • QueryData 对象传递给 LocationHandler
    • 返回从 LocationHandler 返回的 ResponseData 对象。
  • 位置处理程序
    • RequestHandler 接收 QueryData 对象
    • 查找位置并创建一个 LocationData 对象来存储它。
    • QueryDataLocationData 对象传递给不同的帮助器,例如返回特定数据的 TideHandlerWeatherHandler初始查询。
    • 返回一个 ResponseData 对象数组,其中包含从每个特定帮助程序(TideHandler、WeatherHandler 等)返回给它的响应
  • 潮汐处理程序
    • LocationHandler 接收 QueryDataLocationData 对象。
    • 使用数据对象查找潮汐数据是否有效。创建一个 ResponseData 对象来存储它。
    • ResponseData 返回到 LocationHandler

以这种方式做所有事情,我得到了一种“即插即用”的 OOP 方法,使我可以更轻松地添加到其中(我认为?)。很抱歉导致我的问题的冗长解释......

问题:

将数据集封装到一个对象(而不是数组)中以传递给其他对象,这些对象对其执行功能并发送新的/修改的对象,这是一种常见的做法吗?还有哪些其他解决方案或模式可以提供类似级别的功能和灵活性?

【问题讨论】:

  • 在 PHP 中?如果您关心封装或类型检查,当然可以。但是,由于 PHP“数组”实际上是字典,因此传递 PODS 并不重要。
  • 另外,我觉得 ZF 有点过度设计。 JMNSHO。 YMMV。
  • 仅包含属性的对象会比等效设计的关联数组使用更多资源吗?或者它几乎相等......
  • 资源使用情况确实不够担心。当你达到它产生影响的地步时,你正在处理的数据集太大了,PHP 无论如何都无法舒适地处理。
  • 好的。因此,就将关注点分成不同的“处理程序”而言,通过它们传递数据并将返回值 waterfall 返回到原始请求点是一种不好的做法吗?

标签: php oop design-patterns object


【解决方案1】:

我认为您正在做的是非常好的实践,但请记住,您的 Data 对象就是这样 - 对象 - 所以您可能会发现将一些常用方法构建到这些对象或其父对象中非常方便.对于我自己,我想说,如果您需要的只是要传递的数据本身,那么请使用数组。如果您想将数据存储在能够操作或以其他方式处理数据的东西中,请使用对象:

class MyData {
    protected $data = array();

    public function __construct($in_data)
    {
        $this->data = self::prepare_data($in_data);
    }

    protected static function prepare_data($data)
    {
        // do something to the data
    }
}

$myData = new MyData($_REQUEST['data']);
$myData->GetTideData(); // Etc.

“common practice”实际上只是一种风格——如果一种方法(例如传递数据对象)更适合你,那就去做吧。如果数组更适合您的情况,请使用它。

【讨论】:

  • 我认为使用对象的主要想法是以后,如果需要,我可以向它添加方法。此外,当我在代码的另一部分收到对象时,似乎更容易知道会发生什么。一个数组几乎有太多变化而不是标准化。
  • 当然,这取决于您从哪里获得阵列。如果您总是在处理数据,那么您可以控制结构。然而,对象确实允许您构建您想要拥有的那些方法,并提供具有扩展基类的能力,该基类提供所有数据对象都将使用的基本功能。
猜你喜欢
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
相关资源
最近更新 更多