PHP는 세 가지 관련 메커니즘을 통해 OOP 상속과 추상화를 지원합니다. 클래스 상속(extends), 추상 클래스(부분적인 기반 클래스), 인터페이스(계약)입니다. 각각 다른 설계 목적을 가집니다.
상속 — 부모 클래스를 확장
{
{}
{ ; }
}
{
{ ; }
{
::() . ;
}
}
하위 클래스는 부모를 extends하여 그 멤버를 상속하고 선택적으로 오버라이드합니다. parent::는 오버라이드된 부모 메서드를 호출합니다. PHP는 단일 상속(부모는 하나만)을 지원합니다.
abstract class Shape {
abstract public function area(): float; // 추상 — 하위 클래스가 반드시 구현
public function describe(): string { // 구체적 — 공유 구현
return "Area: " . $this->area();
}
}
class Circle extends Shape {
public function __construct(private float $r) {}
public function area(): float { return 3.14159 * $this->r ** 2; } // 반드시 구현
}
// new Shape(); // ❌ 오류 — 추상 클래스는 인스턴스화 불가
추상 클래스는 추상 메서드(하위 클래스가 반드시 구현)와 구체적인 공유 코드를 혼합합니다 — 직접 인스턴스화할 수 없는 기반입니다.
interface Drawable {
public function draw(): void; // 시그니처만 — 구현 없음
}
interface Serializable {
public function serialize(): string;
}
class Widget implements Drawable, Serializable { // 여러 interface 구현
public function draw(): void { /* ... */ }
public function serialize(): string { return "..."; }
}
인터페이스는 계약(메서드 시그니처, 구현 없음)을 정의합니다. 클래스는 여러 인터페이스를 implements할 수 있습니다 — 단일 상속을 우회하여 기능을 공유하는 PHP의 방식입니다.
extends (상속) → "is-a" 관계, 동작의 재사용 + 오버라이드
abstract class → 공유 코드 + 하위 클래스가 반드시 구현할 메서드를 갖는 기반 (단일)
interface → 여러 무관한 클래스가 충족할 수 있는 계약/기능 (다중)
→ "인터페이스를 향해 프로그래밍하라" — 유연하고 테스트 가능한 설계를 위해 인터페이스에 의존
상속, 추상 클래스, 인터페이스는 핵심 OOP 도구이며, 그 구분을 이해하는 것은 잘 구조화된 PHP 애플리케이션을 설계하는 데(그리고 이들에 크게 의존하는 프레임워크를 다루는 데) 중요합니다. 상속(extends)은 "is-a" 관계를 통한 코드 재사용을 제공하지만, PHP는 단일 상속만 허용합니다. 추상 클래스는 구현된 코드와 하위 클래스가 반드시 정의해야 하는 메서드를 모두 갖는 공유 기반을 제공합니다 — 로직을 공유하는 밀접히 관련된 클래스에 적합합니다. 인터페이스는 계약/기능을 정의하며, 결정적으로 클래스가 여러 개를 구현할 수 있습니다 — 인터페이스를 유연하고 분리된 설계의 핵심이자 단일 상속 제약에 대한 PHP의 해답으로 만듭니다.
각각을 언제 사용할지(is-a 재사용에는 상속, 공유 부분 구현에는 추상 클래스, 계약/기능에는 인터페이스), 그리고 인터페이스를 향해 프로그래밍하는 원칙(테스트 가능하고 유연하며 프레임워크 친화적인 코드를 위해 추상화에 의존)을 아는 것은 객체 지향 PHP 설계에 중요한 지식입니다.
이 메커니즘들은 Laravel과 Symfony 같은 프레임워크가 코드를 구조화하는 방식(어디에나 인터페이스와 추상 기반 클래스)의 토대이므로, 자신의 코드를 잘 설계하고 그 위에 구축하는 프레임워크를 이해하는 데 모두 필수적입니다.