PHP 8의 디자인 패턴: 싱글톤 및 멀티톤

다음 기사에서 PHP의 디자인 패턴에 대해 이야기하고 싶습니다. 그리고 저는 언어가 발전하는 방식이 정말 마음에 들기 때문에 php 8의 마지막 혁신으로 예제를 만들 것입니다.

하나씩 일어나는 것



때때로 우리는 다른 코드 위치에 있는 일부 클래스의 인스턴스 하나만 필요합니다. 예를 들어 웹 애플리케이션을 만들 때 일반적으로 데이터베이스에 연결해야 하며 연결 ​​복사본을 하나만 만들어 모든 파일, 클래스, 함수에서 사용하는 것이 좋습니다. 이를 도와줄 패턴 - Singleton은 가장 대중적이고 쉬운 디자인 패턴 중 하나입니다.

모든 개체에서 하나의 인스턴스로 클래스 데이터베이스 연결 및 로깅을 구현하는 방법을 살펴보겠습니다.

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)
    {
        // ...
    }
}


이제 데이터베이스 테이블에 로그를 작성하는 로거를 사용합니다. 이를 위해서는 db에 연결하고 설정 방법으로 설정해야 합니다.

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

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


멀티톤



그러나 일부 메시지는 파일에 기록해야 하고 일부 메시지는 이메일로 보내야 하기 때문에 로거 인스턴스가 하나만 필요한 경우에는 어떻게 해야 합니까? 아니면 다른 이유가 있을 수 있습니다. 이를 위해 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)
    {
        // ...
    }
}


로그를 파일과 데이터베이스에 저장하기 위한 설정이 다른 두 개의 로거를 만들어 봅시다. 패턴에 중요하지 않기 때문에 파일/데이터베이스에 대한 설정 및 작성기의 세터에 대해 자세히 설명하지 않겠습니다.

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

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

좋은 웹페이지 즐겨찾기