【问题标题】:in PHP, when should I use static methods vs abstract classes?在 PHP 中,什么时候应该使用静态方法与抽象类?
【发布时间】:2009-10-07 20:38:26
【问题描述】:

我的解释是,如果我需要静态访问一个方法,我应该只在我永远不需要实例化它的情况下将类抽象化。这是真的吗?

【问题讨论】:

    标签: php abstract-class static-methods


    【解决方案1】:

    PHP 在类上没有静态标识符,因此需要其他方法来防止实例化。

    您可以通过定义抽象类来防止实例化一个类,这是一种廉价的方法,尽管这不是抽象类的目的。

    其他方法包括定义构造器私有

    private function __construct() {}
    

    如果你想给出一个更有意义的信息来说明为什么它不能被实例化,或者在构造函数中抛出一个异常。

    function __construct() { throw new Exception('This is a static class'); }
    

    如果您也不希望该类被子类化,请声明该类 final。

    final class foo { }
    

    或者在奇怪的情况下,您希望能够对其进行子类化,但不允许它的任何子级实例化声明构造函数 final。 (牵强的情况,但为了完整性)

    final private function __construct() {}
    

    【讨论】:

      【解决方案2】:

      我有点不确定这个问题。静态方法与抽象类完全不同。如果您不想实例化一个类,通常会创建一个抽象类,但您希望实例化子类。使用抽象类对于创建部分实现的类非常有帮助,其中子类将填充其余方法以完全实现该类。

      如果你想阻止使用类,可以将一个充满静态方法的类声明为抽象类,但通常我会说,如果你标记一个类抽象,你应该能够找到扩展该类的类。如果我有一个充满静态方法的类,我不将它标记为抽象,因为没有人会对其进行子类化,这通常会增加混乱。我宁愿它被称为静态类,而不是抽象类。

      【讨论】:

      • 肯定的;抽象与具有私有构造函数的语义非常不同,使用正确的构造函数可以向阅读代码的任何人强烈暗示如何使用该类。
      猜你喜欢
      • 2016-02-15
      • 2011-01-06
      • 2011-03-23
      • 2022-01-02
      • 2012-09-15
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多