PHP 5는 추상 클래스와 추상 메소드를 지원합니다. abstract로 정의된 클래스는 인스턴스화할 수 없습니다. 적어도 하나의 메소드가 추상으로 선언된 경우 모든 클래스는 추상으로 선언되어야 합니다. abstract로 정의된 메서드는 호출 메서드(매개변수)만 선언하고 특정 함수 구현을 정의할 수는 없습니다.
추상 클래스를 상속할 때 하위 클래스는 상위 클래스의 모든 추상 메서드를 정의해야 하며, 이러한 메서드의 액세스 제어는 상위 클래스와 동일하거나 더 완화되어야 합니다. 예를 들어 추상 메서드가 protected로 선언된 경우 하위 클래스에 구현된 메서드는 protected 또는 public으로 선언되어야 하며 private으로 정의할 수 없습니다. 또한 메서드를 호출하는 메서드가 일치해야 합니다. 즉, 필수 매개변수의 유형과 개수가 일관되어야 합니다. 예를 들어, 하위 클래스가 상위 클래스의 추상 메서드 선언에 포함되지 않은 선택적 매개 변수를 정의하는 경우 두 선언 간에 충돌이 없습니다. 이는 PHP 5.4 이후의 생성자에도 적용됩니다. PHP 5.4 이전의 생성자 선언은 다를 수 있습니다.
예제 #1 추상 클래스 예
abstract class AbstractClass { //强制要求子类定义这些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); //普通方法(非抽象方法) public function printOut() { print $this->getValue().'<br>'; } } class ConcreteClass1 extends AbstractClass { protected function getValue() { return "ConcteteClass1"; } 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_')."<br>"; $class2 = new ConcreteClass2; $class2 -> printOut(); echo $class2->prefixValue('Bar_')."<br>";
출력 결과:
ConcteteClass1
Foo_ConcreteClass1
ConcreteClass2
Bar_ConcreteClass2
예제 #2 추상 클래스 예
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').'<br>'; echo $class->prefixName('Pacwoman').'<br>';
출력 결과:
Mr. Pacwoman