在PHP中,何时应该使用静态方法与抽象类?

9 php abstract-class static-methods

我的解释是,如果我需要静态访问一个方法,我应该只在我不需要实例化时才使该类成为抽象.真的吗?

str*_*oop 6

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

您可以通过将类定义为抽象来阻止实例化,并且这是一种廉价的方法,尽管这不是抽象类的目的.

其他方法包括将构造函数定义为私有

private function __construct() {}
Run Code Online (Sandbox Code Playgroud)

如果您希望提供更有意义的消息,告诉它为什么无法实例化,或者在构造函数中抛出异常.

function __construct() { throw new Exception('This is a static class'); }
Run Code Online (Sandbox Code Playgroud)

如果你也不希望类子类声明类final.

final class foo { }
Run Code Online (Sandbox Code Playgroud)

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

final private function __construct() {}
Run Code Online (Sandbox Code Playgroud)


Kek*_*koa 3

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

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