9

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

4

2 回答 2

6

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

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

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

private function __construct() {}

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

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

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

final class foo { }

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

final private function __construct() {}
于 2009-10-07T20:56:32.863 回答
3

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

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

于 2009-10-07T20:51:02.360 回答