【问题标题】:What pattern to choose for php module?php模块选择什么模式?
【发布时间】:2013-02-23 19:21:41
【问题描述】:

我想要一个小的 php 模块。该模块将具有纯函数的方法。所以,这只是函数的集合。所有函数都获取一些参数并仅根据输入参数返回结果。

我有一些建议:

1.静态类

PHP 没有真正的静态类,所以我只创建了一个包含所有静态方法的类:

class Some_Module
{
    static public function sum($a, $b, $c)
    {
        return $a+$b+$c;
    }

    static public function method2($a, $b)
    {
         return $a-$b+5;
    }
}

这样的模块很容易使用:

$x = Some_module::sum(1,2,3);

但是,我听说(有很多关于 SO 的主题),静态是一种不好的做法。

2。单身人士

它不是那么容易使用:

// we should not to forget to get instance
$module_instance = new Some_module;
$x = $module_instance->sum(1,2,3);

不便之处在于,我们现在应该初始化这个模块。 另外,关于 SO 的话题很多,这里解释了为什么 Singleton 在 PHP 中没有用,所以这也是一种不好的做法。

这样的模块使用什么模式?

【问题讨论】:

  • 从道听途说中听取建议是最糟糕的做法。 - 您的示例太抽象,无法推荐一种实现。然而,显然将输入输出函数放入对象中并不是很明智。虽然它们应该是普通函数,但静态类是功能分组的公认解决方法(仅此而已)。特别是如果您无法忍受命名空间语法替代方案。

标签: php design-patterns module


【解决方案1】:

我认为这次讨论将有助于您做出决定Static methods: are they still bad considering PHP 5.3 late static binding?

就个人而言,这取决于上下文。存储一堆杂项。辅助方法,我更有可能将它用作全局和命名空间。在存储不需要实例化的特定类别的有限数量的方法时,静态类可能是一个不错的选择。请注意,出于单元测试目的,许多类在错误的上下文中使用静态方法,例如 cool::method,这将是地狱。

// keep it abstract to prevent it from being instantiated
abstract class Foo {
   // cannot be altered if inherited, although limitation still exists
   final public static function bar() {
      echo 'test';
   }
}

Foo::bar();

【讨论】:

    【解决方案2】:

    简单,使用一个类,但不要将方法设为静态。当然,这意味着您将使用额外的一行来实例化它,这没什么大不了的。您将能够正确扩展该类并模拟它以进行测试。

    【讨论】:

      猜你喜欢
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 2015-10-25
      相关资源
      最近更新 更多