php - PHP 中的静态类通过抽象关键字?

标签 php class static abstract

根据PHP manual ,像这样的类:

abstract class Example {}

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

class Registry {}
// and later:
echo Registry::$someValue;

简单地将类声明为抽象类会被认为是好的风格吗?如果不是,与抽象类相比,将构造函数隐藏为 protected 方法有什么优势?

提问的理由:据我所知,它可能有点滥用功能,因为手册将抽象类称为更像是具有实例化可能性的后续类的蓝图。

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

不幸的是,这或多或少正好重复了我的问题。使用单例模式(也就是隐藏 __construct())的 优势 与仅将其声明为 abstract 而不必担心这一点相比有什么好处? (例如,开发人员之间的强烈内涵是,抽象 类实际上未使用 左右。)

最佳答案

如果你的类不打算定义一些父类(super class)型,它不应该被声明为abstract,我会说。

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

  • __construct__clone 定义为私有(private)方法
    • 所以类不能从外部实例化
  • 而且,这样,您的类就可以创建自己的一个实例


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

  • 使用单例意味着使用类的实例;使将非单例类转换为单例类变得更容易:只需将 __construct__clone 设为私有(private),并添加一些 getInstance 方法.
  • 使用单例还意味着您可以访问普通实例可以使用的所有内容:$this、属性...
  • 哦,第三个(对此不确定,但可能很重要):对于 PHP < 5.3,您使用静态方法/数据的可能性较小:
  • 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/

相关文章:

php - 向下滚动时如何停止页面顶部的导航栏

c++ - 使用模板参数时的交叉引用

C++访问嵌套类的私有(private)成员

python - 从原始文件外部的类导入函数

oop - 单例类 : static properties or non-static properties?

c++ - 这个静态变量赋值给局部函数中的指针有什么问题?

php - mysqli_fetch_assoc 崩溃但 mysqli_fetch_array(MYSQLI_NUM) 工作

javascript - jQuery - 单击事件未触发

php - SQL 代码执行 : Trending topics equals a twitter

c++ - 在 main() 之前在单独的文件中初始化/准备类对象