PHP 7에서는 스칼라 타입 선언(scalar type declaration)과 반환 타입 선언(return type declaration)을 통해 두 가지 방식의 타입 힌트(type hinting)를 제공합니다.
- 약한 타입 힌트(Weak type hinting)
- 엄격한 타입 힌트(Strict type hinting)
약한 타입 힌트(Weak Type Hinting)
기본적으로 PHP 7은 약한 타입 검사 모드로 동작합니다. 약한 타입 검사 모드에서는 타입 선언과 일치하지 않는 값이 전달되어도 오류나 치명적인 에러(fatal error)가 발생하지 않습니다. 대신 PHP가 내부적으로 값을 적절히 변환하여 코드를 그대로 실행합니다.
약한 타입 검사는 declare(strict_types=0); 구문으로 명시적으로 설정할 수 있습니다.
declare(strict_types=0); // 약한 타입 검사: strict 값을 0으로 설정
약한 타입 힌트 예제 1
<?php
$x = 10; // 정수형 변수 x = 10
$y = 20.20; // 실수형 변수 y = 20.20
function add(int $x, int $y){
return $x + $y;
}
echo add($x, $y);
?>실행 결과
30
설명: 위 예제에서는 매개변수에 엄격한(strict) 타입 검사를 적용하지 않았습니다. 변수 x에는 정수 10을, 변수 y에는 실수 20.20을 담아 add() 함수에 전달했지만, y가 실수임에도 불구하고 어떠한 오류도 발생하지 않습니다. PHP가 자동으로 실수 20.20을 정수로 변환하여 처리하기 때문에 결과는 정수값 30이 출력됩니다.
약한 타입 힌트 예제 2
<?php
function returnadd(int ...$integers){
return array_sum($integers);
}
var_dump(returnadd(2, '3', 4.1));
?>실행 결과
int(9)
가변 인자(variadic parameter)를 사용하는 위 예제에서도 문자열 '3'과 실수 4.1이 각각 정수 3과 정수 4로 자동 변환되어 합계인 int(9)가 반환됩니다. 이것이 바로 약한 타입 검사의 유연성입니다.
엄격한 타입 힌트(Strict Type Hinting)
엄격한 타입 힌트 모드에서는 타입 선언과 일치하지 않는 값이 전달되면 즉시 치명적인 오류(Fatal Error)가 발생합니다. 즉, 매개변수는 반드시 타입 선언과 정확히 동일한 타입이어야 하며, 그렇지 않으면 TypeError가 발생합니다.
엄격한 타입 검사를 사용하려면 파일의 첫 번째 문장으로 반드시 declare(strict_types=1);을 선언해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다.
또한 중요한 특징은, 이 지시문이 선언된 해당 파일에만 영향을 미친다는 점입니다. include나 require로 포함된 다른 파일에는 영향을 주지 않으므로, 파일 단위로 타입 검사 수준을 선택적으로 적용할 수 있습니다.
엄격한 타입 힌트 지시문은 완전히 컴파일 시점(compile-time)에 처리되며, 런타임(runtime)에 제어할 수 없다는 점도 기억해야 합니다.
엄격한 타입 힌트 예제 1
<?php
declare (strict_types=1);
function returnadd(float $x , float $y){
return $x + $y;
}
var_dump(returnadd(3.1, 2.1)); // 출력: float(5.2)
var_dump(returnadd(3, "2 days")); // fatal error 발생
?>실행 결과
float(5.2)
Fatal error: Uncaught TypeError: Argument 2 passed to returnadd() must be of the type float, string given, called in C:\xampp\htdocs\gud.php on line 7 and defined in C:\xampp\htdocs\gud.php:3 Stack trace: #0 C:\xampp\htdocs\gud.php(7): returnadd(3, '2 days') #1 {main} thrown in C:\xampp\htdocs\gud.php on line 3첫 번째 호출에서는 두 인수 모두 float 타입이므로 정상적으로 float(5.2)가 출력됩니다. 그러나 두 번째 호출에서는 정수 3과 문자열 "2 days"가 전달되었고, 엄격 모드에서는 자동 형 변환이 허용되지 않기 때문에 TypeError가 발생하며 프로그램이 중단됩니다.
엄격한 타입 힌트 예제 2
<?php
declare(strict_types=1); // 엄격 모드 타입 검사 활성화
$x = '1'; // 문자열
$y = 20; // 정수
function add(int $x, int $y){
return $x + $y;
}
var_dump(add($x, $y));
?>위 코드는 "fatal error"를 출력합니다.
이 예제에서는 strict_types=1로 선언했기 때문에, 문자열 '1'이 정수 매개변수에 전달되는 순간 아래와 같은 오류 메시지가 나타납니다.
Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type int, string given
정리: 약한 타입 vs 엄격한 타입
| 구분 | 약한 타입 힌트 (기본값) | 엄격한 타입 힌트 (strict_types=1) |
|---|---|---|
| 타입 불일치 시 | 자동 형 변환 후 실행 | TypeError / Fatal Error 발생 |
| 적용 범위 | 모든 파일 (기본 동작) | 선언된 파일에만 적용 |
| 코드 안정성 | 유연하지만 버그 가능성 존재 | 예측 가능하고 안전한 코드 작성 가능 |
대규모 프로젝트나 협업 환경에서는 타입 관련 버그를 조기에 잡을 수 있는 엄격한 타입 힌트를 사용하는 것이 권장됩니다. 반면 빠른 프로토타이핑이나 유연성이 필요한 경우에는 기본값인 약한 타입 힌트를 사용할 수 있습니다.