代码之家  ›  专栏  ›  技术社区  ›  avpaderno

将类用作命名空间

  •  2
  • avpaderno  · 技术社区  · 15 年前

    我不应该用静态方法创建最后一个类,以避免调用某些内部函数,有什么原因吗?

    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 回复  |  直到 10 年前
        1
  •  2
  •   ircmaxell    15 年前

    我个人建议使用类来分组类似的逻辑。因此,在您的案例中(您提供的示例),这是一个好主意。

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

    就我个人而言,我喜欢保持静止的概念。原因有三个方面。首先,它在内存上更容易(因为没有需要跟踪的实例)。其次,它更快(静态方法调用比实例方法调用更快)。第三,更重要的是,这是有道理的。实例有一个状态(这就是为什么它们是实例)。你们班需要州政府吗?如果是,则使用实例。如果不是,那就是 静止的 课程是为…

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

        2
  •  3
  •   Sjoerd    15 年前

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

    制作班级 最终的 也是一个好主意,因为这表明类的设计没有考虑重载,并且使类更简单。

    上课 静止的 这是一个坏主意,因为它将呼叫者紧紧地结合在一起。如果调用test::generateword(),则始终使用测试类。但是,如果使用$test->generateword(),则可以传入另一个类,该类创建其他单词。这使得更改软件和单元测试更容易。