我的解释是,如果我需要静态访问一个方法,我应该只在我不需要实例化时才使该类成为抽象。这是真的吗?
答案 0 :(得分:6)
PHP在类上没有静态标识符,因此需要其他方法来防止实例化。
您可以通过将类定义为抽象来阻止实例化,并且这是一种廉价的方法,尽管这不是抽象类的目的。
其他方法包括定义构造函数私有
private function __construct() {}
如果您希望提供一个更有意义的消息,告诉它为什么无法实例化,请在构造函数中抛出异常。
function __construct() { throw new Exception('This is a static class'); }
如果您也不希望类子类声明类final。
final class foo { }
或者在奇怪的情况下,您希望能够对其进行子类化,但不允许任何子类实例化声明构造函数final。 (牵强附会的情况,但为了完整)
final private function __construct() {}
答案 1 :(得分:3)
我对这个问题有点不确定。静态方法与抽象类完全不同。通常,如果您不希望实例化类,则会创建一个抽象类,但是您希望实例化子类。使用抽象类对于创建部分实现的类非常有用,其中子类将填充其余的方法以完全实现该类。
如果你想阻止类的使用,可以将一个充满静态方法的类声明为abstract,但通常我会说如果你标记一个类abstract,你应该能够找到扩展该类的类。如果我有一个充满静态方法的类,我不将它标记为抽象,因为没有人将它子类化,并且它通常会增加混淆。我宁愿将其称为静态类,而不是抽象类。