【问题标题】:PHP class encapsulation optionsPHP 类封装选项
【发布时间】:2012-08-31 02:53:59
【问题描述】:

在最近的阅读中,我看到有关封装方法和 OOP 最佳实践的相互矛盾的建议。

我正在开始开发一系列 PHP 类,这些类将用于将数据从多个源系统传输和转换到最终目的地。因此,第一类的属性是包含源 URL 和身份验证值。

以下哪项最适合具有无限扩展潜力的长期项目?

  1. 声明为公共属性。构建类时为每个源在外部设置值。优点:简单。缺点:没有封装优势

  2. 使用 __get 和 __set。在外部为每个源设置值。优点:遵循 OOP 约定。缺点:对外部访问全部开放;再次,没有封装

  3. 将属性声明为受保护。对于我需要使用的每个源系统,扩展原始类并在子类中设置属性。 Pro:OOP 封装。缺点:需要管理更多类和潜在文件。

目前,选项 3 似乎是最好的,尽管文件开销很大。我也愿意接受其他想法。

我为这个问题阅读的参考资料:

http://typicalprogrammer.com/?p=23

Getter and Setter?

http://www.php.net/manual/en/language.oop5.overloading.php

Independent getter/setter methods, or combined?

http://martinfowler.com/bliki/GetterEradicator.html

Is it worth making get and set methods in OOP?

【问题讨论】:

  • 3 ...另外两个选择是垃圾。
  • 请记住,继承会破坏封装,因此您应该尽可能使用组合。

标签: php oop


【解决方案1】:

至少还有一个选择:将这些参数注入到构造对象中,并通过 getter 使它们成为只读的“属性”。仅通过工厂构造对象(您也可以强制执行此操作,但我不确定这样做是否有任何实际好处)。

工厂可以在启动时进行配置(这可能是一个优点),只有一类传输,消费者只能以它选择的公开方式(封装)查看每个传输的状态。

【讨论】:

  • +1 非常适合您将丰富的 OO 和可测试性知识提炼成简明的答案,让接触有限的人能够理解……我太懒了 :)
  • 谢谢乔恩。我正在重新研究设计模式,并开始阅读有关依赖注入的内容。
【解决方案2】:

选择三个,但实际上您应该将它们设为私有。 (请注意,除了您列出的三个选项之外,还有更多选项,这不一定是最佳选择,但我没有足够的信息来为您决定。)其他两个选项对于开发可扩展的 OOP 应用程序都不是特别有用.

【讨论】:

  • +1 建议 private 避免“受保护的成员破坏我的封装”陷阱。
  • 谢谢你。我将阅读更多关于 privateprotected 继承的内容。
猜你喜欢
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
相关资源
最近更新 更多