PHP OOP - 추상 클래스
PHP - 추상 클래스와 메소드란 무엇입니까?
추상 클래스와 메서드는 부모 클래스에 명명된 메서드가 있지만 작업을 채우기 위해 자식 클래스가 필요한 경우입니다.
추상 클래스는 하나 이상의 추상 메서드를 포함하는 클래스입니다. 추상 메서드는 선언되었지만 코드에서 구현되지 않은 메서드입니다.
추상 클래스 또는 메서드는 다음 abstract
키워드로 정의됩니다.
통사론
<?php
abstract class
ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract
public function someMethod3() : string;
}
?>
추상 클래스에서 상속할 때 자식 클래스 메서드는 동일한 이름과 같거나 덜 제한된 액세스 한정자로 정의되어야 합니다. 따라서 추상 메서드가 protected로 정의되어 있으면 자식 클래스 메서드는 private이 아닌 protected 또는 public으로 정의해야 합니다. 또한 필수 인수의 유형과 개수는 동일해야 합니다. 그러나 자식 클래스에는 선택적 인수가 추가로 있을 수 있습니다.
따라서 자식 클래스가 추상 클래스에서 상속될 때 다음과 같은 규칙이 있습니다.
- 자식 클래스 메서드는 동일한 이름으로 정의되어야 하며 부모 추상 메서드를 다시 선언합니다.
- 자식 클래스 메서드는 같거나 덜 제한된 액세스 한정자로 정의해야 합니다.
- 필수 인수의 수는 동일해야 합니다. 그러나 자식 클래스에는 선택적 인수가 추가로 있을 수 있습니다.
예를 살펴보겠습니다.
예시
<?php
// Parent class
abstract class Car {
public
$name;
public
function __construct($name) {
$this->name = $name;
}
abstract public function intro() : string;
}
// Child classes
class
Audi extends Car {
public
function intro() : string {
return "Choose German
quality! I'm an $this->name!";
}
}
class
Volvo extends Car {
public
function intro() : string {
return "Proud to be
Swedish! I'm a $this->name!";
}
}
class
Citroen extends Car {
public
function intro() : string {
return "French
extravagance! I'm a $this->name!";
}
}
// Create objects from the child classes
$audi = new
audi("Audi");
echo $audi->intro();
echo "<br>";
$volvo = new
volvo("Volvo");
echo $volvo->intro();
echo "<br>";
$citroen = new citroen("Citroen");
echo $citroen->intro();
?>
예시 설명
Audi, Volvo 및 Citroen 클래스는 Car 클래스에서 상속됩니다. 이는 Audi, Volvo 및 Citroen 클래스가 상속 때문에 Car 클래스의 public $name 속성과 public __construct() 메서드를 사용할 수 있음을 의미합니다.
그러나 intro()는 모든 자식 클래스에서 정의되어야 하는 추상 메서드이며 문자열을 반환해야 합니다.
PHP - 더 많은 추상 클래스 예제
추상 메서드에 인수가 있는 다른 예를 살펴보겠습니다.
예시
<?php
abstract class ParentClass {
// Abstract method
with an argument
abstract protected
function prefixName($name);
}
class ChildClass extends ParentClass {
public function prefixName($name) {
if ($name == "John Doe") {
$prefix = "Mr.";
} elseif ($name == "Jane Doe") {
$prefix =
"Mrs.";
} else {
$prefix = "";
}
return
"{$prefix} {$name}";
}
}
$class = new ChildClass;
echo $class->prefixName("John
Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>
추상 메서드에 인수가 있고 자식 클래스에 부모의 추상 메서드에 정의되지 않은 두 개의 선택적 인수가 있는 다른 예를 살펴보겠습니다.
예시
<?php
abstract class ParentClass {
// Abstract method
with an argument
abstract protected
function prefixName($name);
}
class ChildClass extends ParentClass {
// The child class may define optional arguments that are not in the parent's
abstract method
public function prefixName($name, $separator = ".",
$greet = "Dear") {
if ($name == "John Doe") {
$prefix = "Mr";
} elseif ($name == "Jane Doe") {
$prefix =
"Mrs";
} else {
$prefix = "";
}
return
"{$greet} {$prefix}{$separator} {$name}";
}
}
$class = new ChildClass;
echo $class->prefixName("John
Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>