Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我应该使用静态类吗?它的优点(或缺点)是什么?_Php - Fatal编程技术网

Php 我应该使用静态类吗?它的优点(或缺点)是什么?

Php 我应该使用静态类吗?它的优点(或缺点)是什么?,php,Php,我经常看到这些类,但我不在我的项目中使用它们。我从中检查这些设计模式,我注意到它们使用静态类 从上面的第页开始,示例代码: class AutomobileFactory { public static function create($make, $model) { return new Automobile($make, $model); } } 或以单例模式: public static function getInstance() {

我经常看到这些类,但我不在我的项目中使用它们。我从中检查这些设计模式,我注意到它们使用静态类

从上面的第页开始,示例代码:

class AutomobileFactory
{
    public static function create($make, $model)
    {
        return new Automobile($make, $model);
    }
}
或以单例模式:

  public static function getInstance()
    {
        static $instance = null;
        if (null === $instance) {
            $instance = new static();
        }

        return $instance;
    }

第一个示例是factory类。工厂是帮助您创建和配置对象的一段代码。工厂可以是函数或方法、静态类或实例化类。通常不需要实例化工厂,因此通常使用静态类。但我认为工厂也可以被实例化。这样做允许您配置或扩展工厂,因此它比使用单个静态工厂方法更具灵活性

而且,我认为在大多数情况下,静态类只是一个借口。人们通常倾向于将全局函数或变量升级为静态类,以生成“干净”的代码,但这并没有带来多少改进。在PHP支持名称空间之前,它有点有用,但现在,我认为在创建静态类时应该小心

这同样适用于单例,尽管它有它的用途,因为在某些情况下,您希望一个类只有一个实例。这方面的示例包括连接池或硬件控制器。某些对象有多个实例可能会导致问题,因此这是使用单实例的一个很好的理由。 但是人们经常在没有必要的时候把一个对象变成一个单独的对象。在这种情况下,我认为这只是一种掩盖你使用globals的方式,这是一种不好的做法

但是singleton不是一个静态类。它只是一个隐藏其构造函数并提供静态方法来访问类的单个实例的类。它与静态类类似,但不同

我可以推荐阅读。它以一种有趣且易于理解的方式解释了这两种模式(以及更多)。代码示例倾向于Java,但这并不是一个问题。

我建议您首先阅读我将在下面介绍的内容

工厂的要点通常是允许对需要实例化其他对象的方法/对象进行依赖项注入。例如:

public function foo() {
    $bar = new Bar;
}
正如前一篇链接文章所讨论的,这是不好的。但是这个方法必须能够实例化
对象本身。但我们仍然需要依赖注入。
进入工厂:

public function foo(BarFactory $factory) {
    $bar = $factory->create();
}
因此,
静态
工厂是毫无意义的:

public function foo() {
    $bar = BarFactory::create();
}
在这里直接实例化
新条码几乎没有什么优势


单例是一个热门话题,人们通常不鼓励使用单例,原因与不鼓励使用全局对象相同。静态引用的单例又是不好的,正如本文详细讨论的那样。

这些类有明确的用途。让我们以记录器为例

    class Logger() {
        private __construct() {}

      public static function getInstance()
        {
            static $instance = null;
            if (null === $instance) {
                $instance = new static();
            }

            return $instance;
        }

    //other methods here

    }
}
现在,在实例化它之后,您可以执行以下操作

Logger::log(parameters)
其中,
log
是该类中的一个方法


这只是这样一个类非常有用的例子。

这些模式的主要优点是可以从代码中的任何地方调用它们:如果它们是非静态的,则需要实例化factory类,并将其放入您可能需要的每个类/方法中php中没有
静态类。你根本不能使用它们。你的问题不是你是否“应该”使用它们,而是“什么是工厂和单例?”@MarkBaker但为什么不使用非静态类,而不管设计模式如何。对于简单的项目,为什么我要编写
新类
,我可以只使用这些静态类?@PLB更简单:
最终私有函数uuu construct(){}
也可以在此处抛出一个异常。+1用于识别某个时间和地点的单例是有效和适当的,并且如果您希望有不同类型的记录器(日志到文件、邮件、控制台、到开发人员/nul)?如果要同时登录到两个目标,该怎么办?这只是一个例子,我会考虑使用不同的模式。