使用类作为命名空间

时间:2010-06-19 12:07:15

标签: php class drupal static final

有什么理由我不应该用静态方法创建一个final类来避免调用一些内部函数?

final class ModuleGlobalFunctions {
  static public function generateWord {
    $result = '';

    while (strlen($result) < 12) {
      $result = self::generateSyllable();
    }

    return $result
  }

  static private function generateSyllable() {
    // Generates a random syllable.
    // …
  }
}

$word = ModuleGlobalFunctions::generateWord();

// It raises an error.
$syllable = ModuleGlobalFunctions::generateSyllable();

2 个答案:

答案 0 :(得分:3)

创建以屏蔽私有函数是一个好主意。这样,类中的公共方法可以调用私有方法,而不会从类外部调用私有方法。

创建一个类 final 也是一个好主意,因为这表明该类没有考虑到重载的设计,并使该类更简单。

使类静态是一个坏主意,因为它将调用者与类紧密耦合。如果你调用Test :: generateWord(),它将始终使用Test类。但是,如果使用$ test-&gt; generateWord(),则可以传入另一个类,该类创建其他单词。这样可以更轻松地更改软件并更容易对其进行单元测试。

答案 1 :(得分:2)

嗯,就个人而言,我建议使用类来分组类似的逻辑。所以在你的情况下(你提供的例子),这是一个好主意。

至于最终,这是一个折腾。我更喜欢使用 abstract 来防止实例化(因为PHP不支持静态类)。如果您确实使用final,我建议添加一个私有构造函数来防止实例化:private function __construct() {} ...

就个人而言,我喜欢保持静态的概念。原因是三折。首先,它在内存上更容易(因为没有实例可以跟踪)。其次,它更快(静态方法调用比实例方法调用快)。第三,更重要的是,这是有道理的。实例具有状态(这就是它们为实例的原因)。你的班级需要一个州吗?如果是,则使用实例。如果没有,那正是静态类的意思......

至于Sjoerd提到的传递实例,你可以用静态类来实现(实际上与实例的耦合程度更低)。这就是原因。除非您需要(并检查)接口或继承,否则您不知道该对象是否实际实现了方法generateWord()。但是,如果传入回调函数,方法的访问方式(或其底层构造)并不重要,重要的是它具有相同(或类似)的语法(关于参数和返回值)。现在,接口是一个更好的解决方案(因为它强制执行接口),但它们需要非常深入地了解OOP才能使设计正确。在紧要关头,回调对于那种情况会很好......