PHP의 싱글턴 모드와 정적 변수에 대해 이야기해 보겠습니다.

青灯夜游
풀어 주다: 2023-04-09 10:54:01
앞으로
2683명이 탐색했습니다.

PHP의 싱글턴 모드와 정적 변수에 대해 이야기해 보겠습니다.

PHP에는 일반적인 의미의 정적 변수가 없습니다. Java나 C++와 달리 PHP에서 정적 변수의 생존 기간은 각 PHP의 세션 기간뿐이므로 Java나 C++와 같은 정적 변수는 없을 수밖에 없습니다.

PHP의 정적 변수

PHP에서 정적 변수의 의미는 단지 특정 구조(메서드 또는 클래스)의 변수를 전달하는 것이며 해당 범위는 이 파일 내에 있습니다.

function test(){
    static $var = 1; 
    echo $var++.'';
}
test();
test();
test();
//OutPut
//1
//2
//3
로그인 후 복사

3번의 함수 테스트 호출에서 $var 변수는 3번의 호출에 존재하며, 지워지거나 재설정되지 않고 매번 1씩 증가합니다
그래서 정적 변수가 현재 구조에 있다는 결론을 내릴 수 있습니다. 그것은 신체의 수명주기 전반에 걸쳐 존재합니다. 현재 예에서 테스트 기능의 라이프사이클은 현재 PHP 스크립트이며, 이는 프로그램이 출시되지 않는 한 유효합니다.

정적 변수는 클래스에 있습니다

그리고 클래스의 코드는 다음과 같습니다

class A
{
    private static $a = 1; 
    private $b = 2;
    public function add()
    {
        echo self::$a++.'';
        echo $this->b++.'';
    }
}
$class1 = new A();
$class1->add();
$class1->add();
$class2 = new A();
$class2->add();
$class2->add();
//Output
//1
//2
//2
//3
//3
//2
//4
//3
로그인 후 복사

위 클래스의 실행 결과에서 함수에서도 동일한 결과를 얻었습니다

대략적으로 요약하자면,

PHP의 정적 변수는 해당 구조체의 수명 주기 동안 영구적으로 존재하며 구조체가 몇 번 호출되거나 인스턴스화되더라도 값은 일관되게 유지됩니다.

사실 이것이 동적 변수와 정적 변수의 차이점입니다. 자세한 내용은 이 문서를 참조하세요. 동적 변수는 클래스 내에서만 유효한 반면 정적 변수는 현재 PHP 스크립트 내에 있습니다.

싱글턴 모드의 정적 변수

싱글턴 모드를 다시 살펴보면

class A
{
    private static $instance = null;
    private $b = 1;
    public static function get_instance()
    {
        if(self::$instance == null){
            $classname = __CLASS__;
            self::$instance = new $classname(); 
        }
        return self::$instance;
    }
    public function add()
    {
        $this->b++;
    }
    public function show()
    {
        echo $this->b;
    }
}
$a = A::get_instance();
$b = A::get_instance();
//此处$a和$b变量完全相同!
$a->add();
$a->show();
echo '';
$b->show();
//output
//2
//2
로그인 후 복사

이때, 싱글턴 모드의 존재로 인해 $a와 $b는 완전히 동일한 객체이므로, 필요하다면 데이터를 공유하려면 정적 변수가 전혀 필요하지 않습니다. (말도 안 돼요, 자기 자신만 있으면 됩니다. 언제든지 애플리케이션에는 이 클래스의 인스턴스가 하나만 있기 때문입니다! 싱글톤을 몇 번 호출하더라도 데이터는 내부는 다시 인스턴스화되지 않습니다. )

따라서 싱글톤 패턴에서는 정적 변수가 전혀 의미가 없습니다. 물론, 할 일이 없고 new 메소드를 사용하여 객체를 초기화해야 한다고 고집한다면, 이때는 싱글턴 모드가 깨지고 싱글턴 모드가 없는 상태로 돌아갑니다.

객체를 인스턴스화하기 위해 new를 사용하는 것을 방지하려면 클래스의 __construct 함수를 개인 속성으로 설정하는 것을 고려할 수 있습니다.

class A
{
    private static $instance = null;
    private $b = 1;
    private function __construct()
    {
    //Code in this function
    //could not be get out of the class
    }
    public static function get_instance()
    {
        if(self::$instance == null){
            $classname = __CLASS__;
            self::$instance = new $classname();
        }
        return self::$instance;
    }
    public function add()
    {
        $this->b++;
    }
    public function show()
    {
        echo $this->b;
    }
}
$a = A::get_instance();
$b = A::get_instance();
//此处$a和$b 变量完全相同!
$a->add();
$a->show();
echo '
';
$b->show();
//output
//2
//2
  
//如果尝试用new来实例化的话
$c = new A();
//output
//Fatal error: Call to private A::__construct() from invalid context in
//如果需要A类的实例化对象,只能通过开放的get_instance静态方法进行初始化
로그인 후 복사

장점: 싱글톤 모드는 각각의 새로운 작업이 메모리를 소비하기 때문에 많은 수의 새로운 작업을 피할 수 있습니다. 리소스 및 시스템 리소스

단점: PHP에서는 전역 변수든 클래스의 정적 멤버든 모든 변수가 페이지 수준입니다. 페이지가 실행될 때마다 새 개체가 다시 설정되고 이후 삭제됩니다. 페이지가 실행되면 PHP 싱글턴 모드는 의미가 없는 것 같습니다. 따라서 단일 페이지 수준 요청에서 여러 애플리케이션 시나리오가 발생하고 동일한 개체 리소스를 공유해야 하는 경우에만 PHP 싱글턴 모드가 매우 의미가 있다고 생각합니다

관련 튜토리얼 추천: "PHP Tutorial"

위 내용은 PHP의 싱글턴 모드와 정적 변수에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:cnblogs.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!