【发布时间】:2009-10-07 20:38:26
【问题描述】:
我的解释是,如果我需要静态访问一个方法,我应该只在我永远不需要实例化它的情况下将类抽象化。这是真的吗?
【问题讨论】:
标签: php abstract-class static-methods
我的解释是,如果我需要静态访问一个方法,我应该只在我永远不需要实例化它的情况下将类抽象化。这是真的吗?
【问题讨论】:
标签: php abstract-class static-methods
PHP 在类上没有静态标识符,因此需要其他方法来防止实例化。
您可以通过定义抽象类来防止实例化一个类,这是一种廉价的方法,尽管这不是抽象类的目的。
其他方法包括定义构造器私有
private function __construct() {}
如果你想给出一个更有意义的信息来说明为什么它不能被实例化,或者在构造函数中抛出一个异常。
function __construct() { throw new Exception('This is a static class'); }
如果您也不希望该类被子类化,请声明该类 final。
final class foo { }
或者在奇怪的情况下,您希望能够对其进行子类化,但不允许它的任何子级实例化声明构造函数 final。 (牵强的情况,但为了完整性)
final private function __construct() {}
【讨论】:
我有点不确定这个问题。静态方法与抽象类完全不同。如果您不想实例化一个类,通常会创建一个抽象类,但您希望实例化子类。使用抽象类对于创建部分实现的类非常有帮助,其中子类将填充其余方法以完全实现该类。
如果你想阻止使用类,可以将一个充满静态方法的类声明为抽象类,但通常我会说,如果你标记一个类抽象,你应该能够找到扩展该类的类。如果我有一个充满静态方法的类,我不将它标记为抽象,因为没有人会对其进行子类化,这通常会增加混乱。我宁愿它被称为静态类,而不是抽象类。
【讨论】: