타입 시스템

타입 시스템 (Type System)

이 페이지는 PHP의 명목 타입 시스템(nominal type system) 구조를 소개하며, 원자 타입(atomic types)과 복합 타입(composite types), 타입 별칭(type aliases)이 어떻게 구성되는지 설명합니다.

출처: PHP: Type System - Manual

본문

PHP는 강한 행동적 서브타이핑(behavioral subtyping) 관계를 지닌 명목 타입 시스템(nominal type system)을 사용합니다. 서브타이핑 관계는 컴파일 타임(compile time)에 검사되는 반면, 타입의 확인은 런타임(run time)에 동적으로 검사됩니다.

PHP의 타입 시스템은 여러 원자 타입(atomic types)을 지원하며, 이들을 서로 조합해 더 복잡한 타입을 만들 수 있습니다. 이 중 일부 타입은 타입 선언(type declarations)으로 작성할 수 있습니다.

원자 타입 (Atomic types)

일부 원자 타입은 언어에 밀접하게 통합된 내장 타입으로, 사용자 정의 타입으로는 재현할 수 없습니다.

기본 타입(base types) 목록은 다음과 같습니다.

  • 내장 타입 (Built-in types)
    • 스칼라 타입(Scalar types):
      • bool 타입(type)
      • int 타입(type)
      • float 타입(type)
      • string 타입(type)
    • array 타입(type)
    • object 타입(type)
    • resource 타입(type)
    • never 타입(type)
    • void 타입(type)
    • 상대 클래스 타입(Relative class types): self, parent, 그리고 static
    • 싱글턴 타입(Singleton types):
      • false
      • true
    • 단위 타입(Unit types):
      • null
  • 사용자 정의 타입 (User-defined types) — 흔히 클래스 타입(class-types)이라 부릅니다
    • 인터페이스(Interfaces)
    • 클래스(Classes)
    • 열거형(Enumerations)
  • callable 타입(type)

스칼라 타입 (Scalar types)

값이 int, float, string 또는 bool 타입이면 스칼라(scalar)로 간주합니다.

사용자 정의 타입 (User-defined types)

인터페이스(interfaces), 클래스(classes), 열거형(enumerations)으로 사용자 정의 타입을 만들 수 있습니다. 이들은 사용자 정의 타입 또는 클래스 타입으로 간주합니다. 예를 들어 Elephant 라는 클래스를 정의하고, Elephant 타입의 객체를 만들며, 함수에서 Elephant 타입의 파라미터를 요구할 수 있습니다.

복합 타입 (Composite types)

여러 원자 타입을 복합 타입(composite types)으로 결합할 수 있습니다. PHP는 타입을 다음 방식으로 결합하도록 허용합니다.

  • 클래스 타입(인터페이스와 클래스 이름)의 교차(Intersection)
  • 타입의 합집합(Union)

교차 타입 (Intersection types)

교차 타입은 단일 클래스 타입 대신 여러 클래스 타입 선언을 모두 충족하는 값을 받아들입니다. 교차 타입을 구성하는 각각의 타입은 & 기호로 연결됩니다. 따라서 T, U, V 타입으로 이루어진 교차 타입은 T&U&V 로 작성합니다.

합집합 타입 (Union types)

합집합 타입은 단일 타입 대신 여러 서로 다른 타입의 값을 받아들입니다. 합집합 타입을 구성하는 각각의 타입은 | 기호로 연결됩니다. 따라서 T, U, V 타입으로 이루어진 합집합 타입은 T|U|V 로 작성합니다. 만약 그중 하나가 교차 타입이라면 DNF로 작성하기 위해 괄호로 묶어야 합니다: T|(X&Y).

타입 별칭 (Type aliases)

PHP는 두 가지 타입 별칭을 지원합니다: mixediterable. 이들은 각각 object|resource|array|string|float|int|bool|null 의 합집합 타입과 Traversable|array 에 대응합니다.

참고: PHP는 사용자 정의 타입 별칭을 지원하지 않습니다.

더 알아보기