根据PHP manual ,像这样的类:
abstract class Example {}
无法实例化。如果我需要一个没有实例的类,例如对于注册表模式:
class Registry {}
// and later:
echo Registry::$someValue;
简单地将类声明为抽象类会被认为是好的风格吗?如果不是,与抽象类相比,将构造函数隐藏为 protected 方法有什么优势?
提问的理由:据我所知,它可能有点滥用功能,因为手册将抽象类称为更像是具有实例化可能性的后续类的蓝图。
更新:首先感谢大家的回答!但许多答案听起来很相似:“你不能实例化一个抽象类,但对于注册表,为什么不使用单例模式呢?”
不幸的是,这或多或少正好重复了我的问题。使用单例模式(也就是隐藏 __construct()
)的 优势 与仅将其声明为 abstract
而不必担心这一点相比有什么好处? (例如,开发人员之间的强烈内涵是,抽象
类实际上未使用 左右。)
最佳答案
如果你的类不打算定义一些父类(super class)型,它不应该被声明为abstract
,我会说。
在你的情况下,我宁愿去上课:
- 将
__construct
和__clone
定义为私有(private)方法- 所以类不能从外部实例化
- 而且,这样,您的类就可以创建自己的一个实例
- 查看 Singleton design pattern ,关于那个,顺便说一句
现在,为什么要使用单例,而不仅仅是静态方法?我想,至少有几个理由是有效的:
- 使用单例意味着使用类的实例;使将非单例类转换为单例类变得更容易:只需将
__construct
和__clone
设为私有(private),并添加一些getInstance
方法. - 使用单例还意味着您可以访问普通实例可以使用的所有内容:
$this
、属性... - 哦,第三个(对此不确定,但可能很重要):对于 PHP < 5.3,您使用静态方法/数据的可能性较小:
-
__callStatic
仅在 PHP 5.3 中引入 - 没有
__getStatic
,__setStatic
, ... - 其他几个也一样Magic methods !
-
- Late Static Binding仅在 PHP 5.3 中添加;在使用静态方法/类时,没有它通常会使事情变得更难;尤其是在使用继承时。
话虽这么说,是的,有些代码是这样的:
abstract class MyClass {
protected static $data;
public static function setA($a) {
self::$data['a'] = $a;
}
public static function getA() {
return self::$data['a'];
}
}
MyClass::setA(20);
var_dump(MyClass::getA());
会工作...但感觉不太自然...这是一个非常简单的示例(请参阅我之前所说的后期静态绑定(bind)和魔术方法)。
关于php - PHP 中的静态类通过抽象关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2494381/