PHP中的静态类是否通过抽象关键字?

Bol*_*wyn 21 php static class abstract

根据PHP手册,这样的类:

abstract class Example {}
Run Code Online (Sandbox Code Playgroud)

无法实例化.如果我需要一个没有实例的类,例如注册表模式:

class Registry {}
// and later:
echo Registry::$someValue;
Run Code Online (Sandbox Code Playgroud)

简单地将类声明为抽象是否会被认为是好的风格?如果没有,与抽象类相比,隐藏构造函数作为受保护方法有什么好处?

问的理由:据我所知,它可能会有一些功能滥用,因为手册将抽象类更多地描述为具有实例化可能性的后续类的蓝图.

更新:首先,感谢所有的答案!但是很多答案听起来很相似:'你不能实例化一个抽象类,但对于注册表,为什么不使用单例模式?'

不幸的是,这或多或少完全是我的问题的重复.使用单例模式(也就是隐藏)与仅仅声明它而不必担心它相比有什么优势?(例如,开发人员之间的强烈内涵,实际上并没有使用类.)__construct()abstractabstract

Pas*_*TIN 19

如果你的类不是要定义一些超类型abstract,我不应该声明它,我会说.

在你的情况下,我宁愿去上课:

  • 定义__construct__clone私有方法
    • 所以班级不能从外部实现
  • 而且,这样,您的类可以创建自己的实例


现在,为什么要使用Singleton,而不仅仅是静态方法?我想,至少有几个原因是有效的:

  • 使用单例意味着使用类的实例; 可以更容易地将非单例类转换为单例类:只需要make __construct__cloneprivate,并添加一些getInstance方法.
  • 使用单例也意味着您可以访问可以使用普通实例的所有内容:$this,属性,...
  • 哦,第三个(不确定,但可能有它的重要性):PHP <5.3,静态方法/数据的可能性较小:
  • 已经在PHP 5.3中添加了Late Static Binding ; 当使用静态方法/类时,并没有经常使它变得更难; 特别是在使用继承时.


这就是说,是的,有些代码是这样的:

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());
Run Code Online (Sandbox Code Playgroud)

会工作......但它感觉不太自然......这是一个非常简单的例子(参见我之前所说的Late Static Binding和魔术方法).

  • 那么,它只是一种风格的东西? (2认同)