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 중국어 웹사이트의 기타 관련 기사를 참조하세요!