14. final 키워드 적용
이 키워드는 클래스와 메서드를 정의하는 데만 사용할 수 있습니다.
final은 정의()를 의미하기 때문입니다. function은 PHP에서 상수를 정의하는 데 사용되므로 final은 멤버 속성을 정의하는 데 사용할 수 없습니다.
마지막 키로 표시된 클래스는 상속될 수 없습니다.
코드 스니펫
최종 클래스 Person{
… ...
}
class Student 확장 Person{
}
예 다음 오류가 발생합니다.
치명적인 오류: 클래스 학생은 최종 클래스(Person)에서 상속할 수 없습니다.
최종 키로 표시된 메서드는 하위 클래스에서 재정의할 수 없으며
코드 조각
입니다. class Person{
final function say() {
}
}
class Student 확장 Person{
function say() {
}
}
다음 오류 발생합니다:
치명적인 오류: 최종 메서드 Person::say()를 재정의할 수 없습니다.
15. 정적 및 const 키워드 사용
정적 키워드는 클래스의 멤버 속성과 멤버 메서드를 정적 멤버로 설명합니다. 혜택은요?
앞서 우리는 인간을 "Person" 클래스에 선언했습니다. "Person" 클래스에 "그 사람이 속한 국가"
속성을 추가하면 "Person" 클래스를 사용하여 수백 개를 인스턴스화할 수 있습니다. 이상의 인스턴스 개체가 있으면 각 개체는
"국가" 속성을 갖게 됩니다. 프로젝트가 중국용으로 개발된 경우 각 개체는
국가 속성과 기타 속성을 갖게 됩니다. "국가" 속성을 정적
멤버로 만들면 메모리에 국가 속성이 하나만 있게 되며 이 속성을 공유하는 개체가 수백 개 이상 있게 됩니다.
정적 멤버는 외부를 제한할 수 있습니다. 정적 멤버는 클래스에 속하며 어떤 객체 인스턴스에도 속하지 않기 때문에
클래스가 처음 로드될 때 공간이 할당됩니다. 다른 클래스는 액세스할 수 없으며 클래스의 인스턴스와만 공유됩니다.
클래스의 구성원을 어느 정도 보호할 수 있는지
메모리의 관점에서 분석해 보겠습니다. 메모리는 논리적으로 4개의 세그먼트로 나누어져 있으며 개체는 "힙 메모리"
에 배치됩니다. 클래스가 처음 로드될 때 객체의 참조는 "스택 메모리"에 배치되고 정적 멤버는 "초기화된 정적 세그먼트"에 배치됩니다.
배치되면 모든 객체에서 공유할 수 있습니다.
클래스.
코드 스니펫
<? class Person{ //下面是人的静态成员属性 public static $myCountry="中国"; // var $name; //人的名子 //这是人的静态成员方法 public static function say(){ echo "我是中国人<br>"; } } //输出静态属性 echo Person::$myCountry; //访问静态方法 Person::say(); //重新给静态属性赋值 Person::$myCountry="美国"; echo Person::$myCountry; ?>
클래스가 처음 로드될 때 정적 멤버가 생성되기 때문에 위에서 언급한 것처럼 클래스 외부의 개체 없이도 클래스 이름을 사용하여 정적 멤버에 액세스할 수 있으며, 정적 멤버는 이 클래스의 각 인스턴스 개체가 공유됩니다. , 그러면 객체를 사용하여 클래스의 정적 멤버에 액세스할 수 있습니까? 위 그림을 보면, 각 객체 내부에는 정적 멤버가 존재하지 않지만, 각 객체를 공유할 수 있기 때문에 객체를 이용하여 멤버에 접근하게 되면 그러한 속성 정의가 없어 객체에 접근할 수 없다는 것을 알 수 있습니다. 정적 멤버. Java와 같은 다른 객체 지향 언어에서는 객체를 사용하여 정적 멤버에 액세스할 수 있습니다. PHP에서 객체를 사용하여 정적 멤버에 액세스할 수 있다면 작업할 때 정적 멤버를 사용하므로 이를 사용하지 않는 것이 좋습니다. 프로젝트에서는 클래스 이름을 사용하여 액세스하는 것이 목적입니다. 클래스의 정적 메서드는 클래스의 정적 속성에만 액세스할 수 있습니다. 클래스의 정적 메서드는 클래스의 비정적 멤버에 액세스할 수 없습니다. 이유는 매우 간단합니다. class.class를 사용하려면 참조 $this를 사용해야 하며 참조 포인터 $this는 이 메서드를 호출하는 개체를 나타냅니다. 정적 메서드는 개체로 호출되지 않고 이름을 사용하여 액세스되므로 개체가 전혀 없습니다. $this 참조가 없으면 클래스의 비정적 멤버에 액세스할 수 없습니다. 그리고 클래스의 정적 멤버는 개체 없이 액세스할 수 있으므로 클래스의 정적 메서드만 액세스할 수 있습니다. $this가 존재하지 않기 때문에 static 메소드의 다른 정적 멤버에 액세스하기 위해 특수 클래스 "self"를 사용합니다. self는 $this와 유사하지만 self는 이 정적 메소드가 있는 클래스를 나타냅니다. . 따라서 정적 메서드에서는 해당 메서드가 위치한 클래스의 "클래스 이름"을 사용하거나, "self"를 사용하여 다른 정적 멤버에 액세스할 수 있으며, 특별한 상황이 없으면 일반적으로 후자를 사용합니다. "self::member" 속성을 사용하는 방식입니다.
코드 조각
<? class Person{ //下面是人的静态成员属性 public static $myCountry="中国"; //这是人的静态成员方法, 通过self访问其它静态成员 public static function say(){ echo "我是".self::$myCountry."<br>"; } } //访问静态方法 Person::say(); ?>
비정적 메서드에서 정적 멤버에 액세스할 수 있습니까? 물론 가능하지만 "$this"는 사용할 수 없습니다. 참조도 클래스 이름이나 "self:"를 사용해야 합니다. :멤버 속성의 형태".
const는 상수를 정의하는 키워드입니다. PHP에서 상수를 정의하려면 "define()" 함수를 사용하지만, 클래스에서 상수를 정의하려면 C에서와 유사한 "const" 키워드를 사용합니다. #define 프로그램에서
의 값이 변경되면 오류가 발생합니다. "const"로 수정된 멤버 속성은 "static"으로 수정된 멤버와 동일한 방식으로 액세스되며, "클래스 이름"은 다음과 같습니다. 메서드 내부에 "self" 키워드도 사용됩니다. 그러나 "$" 기호를 사용할 필요는 없으며 객체를 사용하여 이에 액세스할 수 없습니다.
코드 스니펫
<?php class MyClass{ //定义一个常量constant const constant = 'constant value'; function showConstant() { echo self::constant . "\n"; //使用self访问,不要加”$” } } echo MyClass::constant . "\n"; //使用类名来访问,也不加”$” $class = new MyClass(); $class->showConstant(); // echo $class::constant; 是不允许的
finalstaticconst 키워드 사용에 대한 더 많은 PHP 객체 지향 가이드 및 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!