정적 키워드는 클래스의 멤버 속성과 멤버 메서드가 정적임을 설명합니다. 정적 멤버의 이점은 무엇인가요? 앞서 우리는 인간을 "Person"이라고 선언했습니다. "Person" 클래스에 "Person"이라는 속성을 추가하면 "Person" 클래스를 사용하여 수백 개 이상의 인스턴스 객체를 인스턴스화할 수 있습니다. "국가" 속성을 사용합니다. 프로젝트가 중국인을 대상으로 개발된 경우 각 개체는 "중국"이라는 국가 속성을 갖게 됩니다. 정적 멤버이므로 메모리에 국가 속성이 하나만 있고 수백 개 이상의 개체가 이 속성을 공유하는 경우 정적 멤버는 클래스에 속하고 어떤 개체 인스턴스에도 속하지 않기 때문에 외부 액세스를 제한할 수 있습니다. 클래스가 처음 로드될 때 공간이 할당되며 클래스의 인스턴스와만 공유됩니다.
메모리 관점에서 분석해 보겠습니다. 메모리는 논리적으로 4개의 세그먼트로 나누어져 있으며, 개체는 "힙 메모리"에 배치되고, 개체의 참조는 "스택 메모리"에 배치됩니다. 클래스가 처음 로드될 때 배치되는 "초기화된 정적 섹션"에서 아래와 같이 힙 메모리의 모든 객체에서 공유할 수 있습니다.
클래스의 정적 변수는 전역 변수와 매우 유사하며 클래스의 모든 인스턴스에서 공유할 수 있습니다. 이는 전역 함수와 유사한 클래스의 정적 메서드에도 적용됩니다.
05 | public static $myCountry = "中国" ; |
10 | public static function say() { |
16 | echo Person:: $myCountry ; |
22 | Person:: $myCountry = "美国" ; |
23 | echo Person:: $myCountry ; |
클래스가 처음 로드될 때 정적 멤버가 생성되므로 클래스 외부에 개체가 필요 없으며 위에서 언급한 클래스 이름을 사용하여 정적 멤버에 액세스할 수 있습니다. 정적 멤버는 이 클래스 의 모든 인스턴스 개체에서 공유됩니다. 그러면 개체를 사용하여 클래스의 정적 멤버에 액세스할 수 있나요? 위 그림을 보면 각 객체 내부에는 정적 멤버가 존재하지 않지만 각 객체를 공유할 수 있으므로 객체를 사용하여 멤버에 액세스하면 이러한 속성 정의가 없습니다. 객체 사용 Java와 같은 다른 개체 지향 언어에서는 개체를 사용하여 정적 멤버에 액세스할 수 있습니다. 회원 여러분, 프로젝트 작업 시 우리의 목적은 클래스 이름을 사용하여 액세스하는 것입니다.
클래스의 정적 메서드는 클래스의 정적 속성에만 액세스할 수 있습니다. 클래스의 정적 메서드는 클래스의 비정적 멤버에 액세스할 수 없습니다. 이 클래스의 메서드에서 이 클래스의 다른 멤버에 액세스하려면 참조 $this를 사용해야 하며 참조 포인터 $this는 이 메서드를 호출하는 개체를 나타냅니다. 정적 메서드는 개체와 함께 호출되지 않습니다. , 그리고 클래스 이름은 에 액세스하는 데 사용되므로 개체가 전혀 없으며 $this에 대한 참조가 없으면 클래스의 비정적 멤버에 액세스할 수 없습니다. 클래스의 정적 멤버는 객체가 필요하지 않습니다.
따라서 클래스의 정적 메서드는 클래스의 정적 속성에만 액세스할 수 있습니다. $this가 존재하지 않으므로 정적 메서드의 다른 정적 멤버에 액세스하려면 특수 클래스 "self를 사용합니다. "; self는 $this와 유사합니다. 단, self는 이 정적 메서드가 있는 클래스를 나타냅니다. 따라서 정적 메서드에서는 메서드가 위치한 클래스의 "클래스 이름"을 사용하거나, 특별한 상황이 아닌 경우 "self"를 사용하여 다른 정적 멤버에 액세스할 수 있습니다. 일반적으로 후자, 즉 "self::member 속성" 방법을 사용합니다.
05 | public static $myCountry = "中国" ; |
07 | //这是人的静态成员方法, 通过self访问其它静态成员 |
08 | public static function say() { |
09 | echo "我是" . self:: $myCountry ; |
비정적 메서드에서 정적 멤버에 접근할 수 있나요? 물론 가능하지만 "$this" 참조는 사용할 수 없습니다. 클래스 이름이나 "self:: 멤버 속성 형식"도 사용해야 합니다.
const는 상수를 정의하는 키워드입니다. PHP에서 상수를 정의하려면 "define()" 함수를 사용하지만, 클래스에서 상수를 정의하려면 C If와 마찬가지로 "const" 키워드를 사용합니다. 프로그램에서 #define 값이 변경되면 오류가 발생합니다. "const"로 수정된 멤버 속성의 액세스 방법은 "static"으로 수정된 멤버의 액세스 방법과 유사하며, "클래스 이름"은 다음과 같습니다. 메서드에 "self" 키워드도 사용됩니다. 그러나 "$" 기호를 사용할 필요는 없으며 객체를 사용하여 이에 액세스할 수 없습니다.
05 | const constant = 'constant value' ; |
07 | function showConstant() { |
08 | echo self::constant . " " ;
// 使用self访问,不要加“$” |
12 | echo MyClass::constant .
" " ; //使用类名来访问,也不加“$” |
15 | $class ->showConstant(); |
16 |
// echo $class::constant; 是不允许的 |
위 내용은 PHP의 static과 const에 대한 내용을 포함하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.