타입 연산자

타입 연산자

PHP의 대표적인 타입 연산자는 instanceof예요. 변수가 특정 클래스의 인스턴스인지, 상속받은 클래스인지, 인터페이스를 구현한 클래스인지 등을 확인해 줘요.

출처: Type Operators

본문

instanceof는 PHP 변수가 특정 클래스의 인스턴스화된 객체인지 판별하는 데 사용해요.

Example #1 클래스와 함께 instanceof 사용하기

<?php
class MyClass
{
}

class NotMyClass
{
}
$a = new MyClass;

var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>

위 예제의 출력은 다음과 같아요.

bool(true)
bool(false)

instanceof는 변수가 부모 클래스를 상속받은 클래스의 인스턴스인지 판별하는 데에도 사용할 수 있어요.

Example #2 상속받은 클래스와 함께 instanceof 사용하기

<?php
class ParentClass
{
}

class MyClass extends ParentClass
{
}

$a = new MyClass;

var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
?>

위 예제의 출력은 다음과 같아요.

bool(true)
bool(true)

객체가 어떤 클래스의 인스턴스가 아닌지 확인하려면 논리 부정(logical not) 연산자를 사용하면 돼요.

Example #3 객체가 어떤 클래스의 인스턴스가 아닌지 instanceof로 확인하기

<?php
class MyClass
{
}

$a = new MyClass;
var_dump(!($a instanceof stdClass));
?>

위 예제의 출력은 다음과 같아요.

bool(true)

마지막으로, instanceof는 변수가 특정 인터페이스를 구현한 클래스의 인스턴스인지 판별하는 데에도 사용할 수 있어요.

Example #4 인터페이스와 함께 instanceof 사용하기

<?php
interface MyInterface
{
}

class MyClass implements MyInterface
{
}

$a = new MyClass;

var_dump($a instanceof MyClass);
var_dump($a instanceof MyInterface);
?>

위 예제의 출력은 다음과 같아요.

bool(true)
bool(true)

instanceof는 보통 리터럴 클래스명과 함께 쓰지만, 다른 객체나 문자열 변수와 함께 사용할 수도 있어요.

Example #5 다른 변수와 함께 instanceof 사용하기

<?php
interface MyInterface
{
}

class MyClass implements MyInterface
{
}

$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';

var_dump($a instanceof $b); // $b is an object of class MyClass
var_dump($a instanceof $c); // $c is a string 'MyClass'
var_dump($a instanceof $d); // $d is a string 'NotMyClass'
?>

위 예제의 출력은 다음과 같아요.

bool(true)
bool(true)
bool(false)

instanceof는 검사 대상 변수가 객체가 아니더라도 오류를 던지지 않고 그냥 false를 반환해요. 다만 PHP 7.3.0 이전에는 상수(constant)를 사용할 수 없었어요.

Example #6 다른 변수들을 instanceof로 검사하기

<?php
$a = 1;
$b = NULL;
$c = fopen('/tmp/', 'r');
var_dump($a instanceof stdClass); // $a is an integer
var_dump($b instanceof stdClass); // $b is NULL
var_dump($c instanceof stdClass); // $c is a resource
var_dump(FALSE instanceof stdClass);
?>

위 예제의 출력은 다음과 같아요.

bool(false)
bool(false)
bool(false)
PHP Fatal error:  instanceof expects an object instance, constant given

PHP 7.3.0부터는 instanceof 연산자의 왼쪽에 상수를 쓸 수 있게 되었어요.

Example #7 상수를 instanceof로 검사하기

<?php
var_dump(FALSE instanceof stdClass);
?>

PHP 7.3에서 위 예제의 출력은 다음과 같아요.

bool(false)

PHP 8.0.0부터는 instanceof를 임의의 표현식과 함께 사용할 수 있어요. 이 표현식은 괄호로 감싸야 하며 문자열을 만들어내야 해요.

Example #8 임의의 표현식과 함께 instanceof 사용하기

<?php

class ClassA extends \stdClass {}
class ClassB extends \stdClass {}
class ClassC extends ClassB {}
class ClassD extends ClassA {}

function getSomeClass(): string
{
    return ClassA::class;
}

var_dump(new ClassA instanceof ('std' . 'Class'));
var_dump(new ClassB instanceof ('Class' . 'B'));
var_dump(new ClassC instanceof ('Class' . 'A'));
var_dump(new ClassD instanceof (getSomeClass()));
?>

PHP 8에서 위 예제의 출력은 다음과 같아요.

bool(true)
bool(true)
bool(false)
bool(true)

instanceof 연산자에는 is_a() 함수라는 기능적 변형이 있어요.

더 알아보기

  • get_class()
  • is_a()