发布于 2026-01-06 2 阅读
0

PHP 8 中的设计模式:替代实现

PHP 8 中的设计模式:替代实现

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

上一篇文章中,我展示了如何使用继承来实现单例和多例设计模式。如果项目中只有几个简单的类,每个类只实现少量方法,并且在所有调用这些方法的地方都只需要一个实例,那么这种方法就相当方便。

PHP 语言只允许单继承,这可能是上一篇文章中提到的变体会使我们的应用程序架构复杂化甚至崩溃的原因。因此,我建议考虑其他实现模式的方法。

通常情况下,正确的解决方案是在每个需要该模式的类中实现该模式。

class Database
{
    private static self|null $instance = null;

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

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

        return self::$instance;
    }

    public function connect()
    {
        // ...
    }
}

$db = Database::getInstance();
$db->connect();
Enter fullscreen mode Exit fullscreen mode

另一种方法是使用特性(trait)。如果项目包含多个类,并且您希望提取部分重复代码以遵循 DRY 原则,则此选项非常合适。

trait MultitonTrait
{
    private static array|null $instance = null;

    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 Database
{
    use MultitonTrait;

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

    public function connect()
    {
        // ...
    }
}

$db = Database::getInstance('mysql');
$db->connect();
Enter fullscreen mode Exit fullscreen mode

本文及上一篇文章中的所有选项都有其优点和缺点,因此应根据特定项目的架构选择最佳解决方案。


PS:各位开发者同仁,如果您觉得这篇文章对您有所帮助,并且渴望加深对 PHP 和 TypeScript 设计模式的理解,那么我有个好消息要告诉您!我正在撰写一本内容全面的书籍,深入探讨这些主题,书中充满了实用示例、清晰易懂的解释以及这些模式在现实世界中的应用。

本书旨在帮助初学者和经验丰富的开发者加深对 PHP 和 TypeScript 设计模式的理解和应用。无论您是想巩固现有知识还是探索新的学习领域,本书都是您的理想之选。

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

我诚邀您订阅我在dev.to上的博客,以便定期获取更新。我非常期待与您一同踏上这段旅程,帮助您将编程技能提升到新的高度!

文章来源:https://dev.to/zhukmax/design-patterns-in-php-8-alternative-implementations-4egj