PHP 8 中的设计模式:单例模式和多例模式

2025-06-07

PHP 8 中的设计模式:单例模式和多例模式

大家好,各位开发者!🧑🏼‍💻

我想在接下来的几篇文章中讨论 PHP 中的设计模式。我非常欣赏这门语言的进步,所以我会用 PHP 8 的最新创新来举例。

单例模式

有时,我们只需要在不同的程序代码中创建某个类的一个实例。例如,当我们创建一个 Web 应用程序时,通常需要连接到数据库,因此最好只创建一个连接副本,并在每个文件、类和函数中使用它。单例模式可以帮助我们实现这一点,它是最流行、最简单的设计模式之一。

让我们看看如何在所有对象中使用一个实例来实现数据库连接和日志记录类:

class Singleton
{
    protected static self|null $instance = null;

    final private function __construct(){}
    final protected function __clone(){}
    final protected function __wakeup(){}

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

        return static::$instance;
    }
}

class Database extends Singleton
{
    public function connect()
    {
        // ...
    }
}

class Logger extends Singleton
{
    private $connection;

    public function settings($connection = null)
    {
        $this->connection = $connection ?? '/var/logs/filename.log';
    }

    public function error(string $message)
    {
        // ...
    }

    public function warn(string $message)
    {
        // ...
    }
}
Enter fullscreen mode Exit fullscreen mode

现在我们将使用一个记录器将日志写入数据库表。为此,我们需要连接到数据库并通过设置方法进行设置:

$db = Database::getInstance();
$db->connect();

$logger = Logger::getInstance();
$logger->settings($db);
$logger->error('Something wrong');
Enter fullscreen mode Exit fullscreen mode

多吨

但是,如果我们需要多个记录器实例,例如某些消息必须写入文件,某些消息需要通过电子邮件发送,或者有其他原因,该怎么办呢?为此,我们将使用 Multiton 模式。Multiton 看起来与上一个模式非常相似,但使用了一个类的实例数组。

class Multiton
{
    protected static array|null $instance = null;

    final private function __construct(){}
    final protected function __clone(){}
    final protected function __wakeup(){}

    public static function getInstance(int|string $key): self
    {
        if (!array_key_exists($key, self::$instance)) {
            self::$instance[$key] = new self;
        }

        return self::$instance[$key];
    }
}

class Logger extends Multiton
{
    private array $settings;

    public function setSettings(array $settings)
    {
        // ...
    }

    public function error(string $message)
    {
        // ...
    }

    public function warn(string $message)
    {
        // ...
    }
}
Enter fullscreen mode Exit fullscreen mode

让我们创建两个具有不同设置的日志记录器,用于将日志保存到文件和数据库中。我不会详细描述设置的设置方法以及将日志写入文件/数据库的方法,因为这对本模式来说并不重要。

$fileLogger = Logger::getInstance('file');
$fileLogger->setSettings([
    //...
]);
$fileLogger->error('Error text');

$dbLogger = Logger::getInstance('database');
$dbLogger->setSettings([
    //...
]);
$dbLogger->error('Error will write in Database');
Enter fullscreen mode Exit fullscreen mode

附言:各位开发者,如果您觉得本文很有价值,并且渴望加深对 PHP 和 TypeScript 设计模式的理解,我有个激动人心的消息要告诉您!我正在撰写一本内容全面的书,深入探讨这些主题,书中充满了实际的例子、清晰的解释以及这些模式的实际应用。

本书面向新手和经验丰富的开发人员,旨在加深您对 PHP 和 TypeScript 设计模式的理解和实践。无论您是想复习现有知识,还是探索新的学习领域,本书都是您的理想伴侣。

此外,您的订阅将在支持本书的完成中发挥关键作用,使我能够继续为您提供优质内容,将您的编码能力提升到前所未有的高度。

欢迎订阅我在dev.to上的博客,以便定期获取更新。我期待与您携手踏上这段旅程,助您将编程技能提升到新的高度!

文章来源:https://dev.to/zhukmax/design-patterns-in-php-8-singleton-multiton-5d99
PREV
5 个 VSCode 技巧和窍门
NEXT
PHP 8 中的设计模式:简单工厂