이 문서의 예제에서는 PHP의 추상, 최종 및 정적의 원리와 사용법을 설명합니다. 참조를 위해 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다:
PHP 5는 추상 클래스와 추상 메서드를 지원합니다. abstract로 정의된 클래스는 인스턴스화할 수 없습니다. 적어도 하나의 메소드가 추상으로 선언된 경우 모든 클래스는 추상으로 선언되어야 합니다. abstract로 정의된 메서드는 호출 메서드(매개변수)만 선언하며 특정 함수 구현을 정의할 수 없습니다.
관련 학습 권장 사항:추상 클래스를 상속할 때 하위 클래스는 상위 클래스의 모든 추상 메소드를 정의해야 합니다 또한 이러한 메소드의 액세스 제어는 이전 클래스와 동일하거나 더 완화되어야 합니다. 학부모 수업 . 예를 들어 추상 메서드가 protected로 선언된 경우 하위 클래스에 구현된 메서드는 protected 또는 public(엄격성: private>protected>public)으로 선언해야 하지만 private으로 정의할 수는 없습니다. 또한 메서드의 호출 방법이 일치해야 합니다. 즉, 필수 매개변수의 유형과 수가 일관되어야 합니다. 예를 들어, 하위 클래스가 상위 클래스의 추상 메서드 선언에 포함되지 않은 선택적 매개 변수를 정의하는 경우 두 선언 간에 충돌이 없습니다. 이는 PHP 5.4 이후의 생성자에도 적용됩니다. PHP 5.4 이전의 생성자 선언은 다를 수 있습니다.
초보부터 마스터까지 PHP 프로그래밍요약:
<?php abstract class AbstractClass { // 强制要求子类定义这些方法,不定义功能实现 abstract protected function getValue(); abstract protected function prefixValue($prefix); // 普通方法(非抽象方法),子类可以不重写 public function printOut() { print $this->getValue() . "\n"; } } class ConcreteClass1 extends AbstractClass { protected function getValue() { return "ConcreteClass1"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass1"; } } class ConcreteClass2 extends AbstractClass { //访问方式可以更宽松 public function getValue() { return "ConcreteClass2"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass2"; } } $class1 = new ConcreteClass1; $class1->printOut(); echo $class1->prefixValue('FOO_') ."\n"; $class2 = new ConcreteClass2; $class2->printOut(); echo $class2->prefixValue('FOO_') ."\n"; ?>
<?php abstract class AbstractClass { // 我们的抽象方法仅需要定义需要的参数 abstract protected function prefixName($name); } class ConcreteClass extends AbstractClass { // 我们的子类可以定义父类签名中不存在的 可选参数 public function prefixName($name, $separator = ".") { if ($name == "Pacman") { $prefix = "Mr"; } elseif ($name == "Pacwoman") { $prefix = "Mrs"; } else { $prefix = ""; } return "{$prefix}{$separator} {$name}"; } } $class = new ConcreteClass; echo $class->prefixName("Pacman"), "\n"; echo $class->prefixName("Pacwoman"), "\n"; ?>
final
부모 클래스의 메서드가 final로 선언되면 자식 클래스는 해당 메서드를 재정의할 수 없습니다. 클래스가 final로 선언되면 상속될 수 없습니다.이것이 더 이해하기 쉬우므로 자세한 내용은 다루지 않겠습니다.
static
PHP 4와 호환되기 위해 액세스 제어가 지정되지 않은 경우 속성과 메서드는 기본적으로 공개로 설정됩니다.
정적 메서드는 객체를 통해 호출할 필요가 없으므로 정적 메서드에서는 의사 변수 $this
를 사용할 수 없습니다.
정적 속성은 ->
연산자를 통해 개체에서 액세스할 수 없습니다. $this
在静态方法中不可用。
静态属性不可以由对象通过 ->
操作符来访问。
用静态方式调用一个非静态方法会导致一个 E_STRICT
级别的错误。
就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
总结:
静态方法无需实例化,可直接访问;
类实例化的对象无法访问类中的静态属性,但是可以访问静态方法;
伪变量 $this
在静态方法中不可用;
静态属性不可以由对象通过 -> 操作符来访问;
用静态方式调用一个非静态方法会导致一个 E_STRICT
E_STRICT
수준 오류가 발생합니다. $this
는 정적 메서드에서 사용할 수 없습니다. 🎜🎜🎜🎜정적 속성은 -> 연산자를 통해 액세스할 수 없습니다. E_STRICT
수준 오류 🎜🎜🎜🎜정적 속성은 리터럴 또는 상수로만 초기화할 수 있으며 표현식은 사용할 수 없습니다(함수 반환 값 /변수/객체 대신) 🎜🎜🎜🎜 변수 호출 클래스를 사용하여 동적으로 만듭니다. 그러나 이 변수의 값은 키워드 self, parent 또는 static일 수 없습니다. 🎜🎜🎜rreee위 내용은 PHP의 추상, 최종, 정적의 원리와 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!