PHP 8의 디자인 패턴: 싱글톤 및 멀티톤
9944 단어 oopwebdevphpprogramming
하나씩 일어나는 것
때때로 우리는 다른 코드 위치에 있는 일부 클래스의 인스턴스 하나만 필요합니다. 예를 들어 웹 애플리케이션을 만들 때 일반적으로 데이터베이스에 연결해야 하며 연결 복사본을 하나만 만들어 모든 파일, 클래스, 함수에서 사용하는 것이 좋습니다. 이를 도와줄 패턴 - 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');
Reference
이 문제에 관하여(PHP 8의 디자인 패턴: 싱글톤 및 멀티톤), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/zhukmax/design-patterns-in-php-8-singleton-multiton-5d99텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)