>  기사  >  백엔드 개발  >  [디자인 패턴] PHP 싱글턴 패턴의 응용 시나리오 및 구현

[디자인 패턴] PHP 싱글턴 패턴의 응용 시나리오 및 구현

大鹏
大鹏원래의
2020-06-02 00:58:483408검색

요약

싱글턴 패턴이란 무엇인가요?

클래스는 하나의 객체(또는 인스턴스)만 생성할 수 있으며, 이 클래스는 싱글턴 클래스입니다. 이 디자인 패턴을 싱글턴 디자인 패턴, 줄여서 싱글턴 패턴이라고 합니다.

싱글턴을 사용하는 이유는 무엇인가요?

  1. 리소스 액세스 충돌을 처리합니다.

    예: 로그를 파일로 인쇄하는 기능.

  2. 은 전 세계적으로 독특한 클래스를 나타냅니다.

비즈니스 개념에서 일부 데이터를 시스템에 하나의 복사본에만 저장해야 한다면 싱글톤 클래스로 설계하는 것이 더 적합합니다. 예: 고유 증가 ID 번호 생성기.

구현 방법

PHP의 싱글톤 모드를 구현하려면 세 단계가 필요합니다.

* 클래스를 저장하기 위해 정적 멤버 변수가 사용됩니다.

* 객체 생성이나 복제를 방지하려면 __construct 및 __clone을 비공개로 선언해야 합니다.

* 이 인스턴스에 액세스하기 위한 공개 정적 메소드, 일반적으로 getInstance

class single
{
    private static  $instance ;
    private function __construct(){}
    private function __clone(){}
    public static function getInstance() {
        if (empty(self::$instance)) {
            self::$instance = new single();
        }
        return self::$instance;
    }
}

싱글톤 클래스에 메소드를 추가하여 ID를 가져옵니다. 전역적으로 고유한 ID 번호 생성기가 나타납니다.

class single
{
    private  $id = 0;
    private static  $instance ;
    private function __construct(){}
    private function __clone(){}
    public static function getInstance() {
        if (empty(self::$instance)) {
            self::$instance = new single();
        }
        return self::$instance;
    }
    public function getId() {
        
        return $this->id++;
        
    }
}

정말 흠잡을 데가 없는데 멀티스레딩의 경우에는 어떻게 될까요?

스레드의 유일한 단일 인스턴스 구현

php의 ts 버전과 nts 버전의 차이점, nts(Non Thread Safe) 단일 스레드 구성, 캐시된 데이터가 스레드 간에 공유된다는 점을 언급해야 합니다. . ts(Thread Safe)는 멀티스레딩 기능으로 구축되었으며 여러 스레드 간에 서로 다른 데이터 복사본을 사용합니다.

ts 버전의 php를 사용하면 자동으로 스레드 안전 모드로 업그레이드됩니다. pthreads 확장은 ts 버전의 php에만 설치할 수 있습니다.

pecl에 포함된 pthreads의 마지막 버전은 php7.0을 기반으로 합니다. github의 pthreads 프로젝트도 업데이트가 중단되었습니다. 관심이 있으시면 7.0으로만 이동하여 기록을 보실 수 있습니다.

php-7.0.9-Win32-VC14-x64 버전에 pthreads 확장을 설치했습니다.

멀티스레딩의 경우 싱글톤의 범위가 프로세스 전용에서 스레드 전용으로 변경됩니다.

require 'single.php';
class Request extends Thread {
    public $url;
    public function __construct($url) {
        $this->url = $url;
    }
    public function run() {
        echo single::getInstance()->getId();
        echo "\n";
    }
}
$chG = new Request("www.google");
$chG ->start();
$chG->join();
echo $chG->getThreadId();
echo "\n";
$chB = new Request("www.baidu");
$chB ->start();
$chB->join();
echo $chB->getThreadId();
echo "\n";

여기서 두 개의 스레드가 생성되지만 두 실행 모두에서 0부터 시작하는 ID를 얻을 수 있습니다. 이는 두 스레드의 단일 클래스가 두 개의 서로 다른 싱글톤 개체임을 나타냅니다.

요약

PHP의 싱글턴 모드를 구현하려면 세 단계를 거쳐야 합니다

* 클래스를 저장하기 위한 정적 멤버 변수입니다.

* __construct 및 __clone은 생성 또는 복제를 방지하기 위해 비공개로 선언됩니다.

* 이 인스턴스에 액세스하는 데 사용되는 정적 메서드(일반적으로 getInstance)입니다.

저는 PHP에서 멀티스레딩을 사용해 본 적이 없습니다. 다들 어떻게 생각하실지 모르겠습니다.

위 내용은 [디자인 패턴] PHP 싱글턴 패턴의 응용 시나리오 및 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.