109호. 타입이 지정된 프로퍼티 하위호환성 문제 free

2020-01-07

안녕하세요. 오늘은 제스 러시로우(Jesse Rushlow)가 자신의 블로그에 올린 PHP 7.4 타입이 지정된 프로퍼티의 하위 호환성이 깨지는 문제를 공유할까 합니다.


PHP 7.4부터 클래스 프로퍼티에 타입을 지정할 수 있게 되었습니다. 타입이 지정된 프로퍼티에 대해 더 알고 싶으신 분은 1일 1식 라라벨 88호를 읽어보세요.


7.4 이전에는 DocBlock으로 스칼라 타입을 지정할 수 있었습니다.


<?php
class MyClass {

/** @var int|null **/
public $id;
}

PHP 7.4 부터는 아래와 같이 타입을 지정할 수 있습니다.


<?php
class MyClass {

public ?int $id;
}

DocBlock으로 타입을 지정했을 때는 초기화(이니셜라이즈)가 되지 않아도 에러가 나지 않습니다. 반면, 타입이 지정된 프로퍼티를 초기화가 되지 않은 상태에서 읽으면 에러가 납니다.


class MyClass {

/** @var int|null **/
public $id;
}

class MyClass2 {

public ?int $id;
}

$myClass = new MyClass;
echo $myClass->id // NULL

$myClass2 = new MyClass2;
echo $myClass2->id // Fatal error

따라서 기존에 DocBlock으로 타입을 지정하던 클래스 프로퍼티를 단순하게 타입이 지정된 프로퍼티로 바꾸면 에러가 발생할 가능성이 있습니다. 반드시 클래스를 사용하는 코드에서 초기화 관련 문제가 발생하지 않는지 확인하셔야 합니다.


전체적으로 테스트가 충분히 작성되어 있지 않다면 기존 클래스의 프로퍼티에 타입을 지정하는 것은 조심해야겠네요.


오늘도 즐거운 PHP 생활하세요~


1일 1식 라라벨 109호


이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.