클래스 추상화
PHP에는 추상 클래스와 메서드가 있습니다. 추상으로 정의된 클래스는 인스턴스화할 수 없으며 최소한 하나의 추상 메서드를 포함하는 모든 클래스도 추상이어야 합니다. 추상으로 정의된 메소드는 단순히 메소드의 서명을 선언합니다. 구현을 정의할 수 없습니다.
추상 클래스에서 상속할 때 부모의 클래스 선언에서 추상으로 표시된 모든 메서드는 자식 클래스에서 정의해야 하며 일반적인 상속 및 서명 호환성 규칙을 따라야 합니다.
예제 #1 추상 클래스 예제
<?php
abstract class AbstractClass
{
// Force Extending class to define this method
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// Common method
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";
?>
위의 예는 다음을 출력합니다.
ConcreteClass1 FOO_ConcreteClass1 ConcreteClass2 FOO_ConcreteClass2
예제 #2 추상 클래스 예제
<?php
abstract class AbstractClass
{
// Our abstract method only needs to define the required arguments
abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
// Our child class may define optional arguments not in the parent's signature
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";
?>
위의 예는 다음을 출력합니다.
Mr. Pacman Mrs. Pacwoman