개요
PHP의 declare 선언문은 while, for, foreach 등 다른 흐름 제어 구조와 유사한 문법을 가지고 있습니다. 선언문은 코드 블록의 실행 방식에 특정 규칙을 적용할 때 사용되며, 지시어(directive)의 종류에 따라 동작이 결정됩니다.
기본 문법
declare (지시어)
{
statement1;
statement2;
. . .
}코드 블록의 동작 방식은 지시어의 종류에 의해 정의됩니다. declare 선언문에는 세 가지 종류의 지시어를 사용할 수 있습니다. 바로 ticks, encoding, strict_types입니다.
ticks 지시어
틱(tick)은 스크립트에서 일정 수의 문장이 실행될 때마다 발생하는 특수 이벤트에 붙여진 이름입니다. 이때 카운트되는 문장들은 PHP 내부적으로 처리되는 저수준(low-level) 명령으로, 조건식과 인자 표현식을 제외하면 대략 스크립트 내의 문장과 1:1로 대응된다고 볼 수 있습니다.
모든 함수는 register_tick_function() 함수를 통해 틱 이벤트와 연결할 수 있으며, 이렇게 등록된 함수는 declare 지시어에서 지정한 틱 수만큼 실행이 진행될 때마다 자동으로 호출됩니다.
다음 예제에서는 declare 블록 안의 for 루프가 5번 반복될 때마다 myfunction()이 실행됩니다.
예제
<?php
function myfunction(){
echo "Hello World\n";
}
register_tick_function("myfunction");
declare (ticks=5){
for ($i=1; $i<=10; $i++){
echo $i."\n";
}
}
?>실행 결과
위 스크립트를 커맨드 라인에서 실행하면 다음과 같은 결과가 출력됩니다.
1 2 3 4 5 Hello World 6 7 8 9 10 Hello World
또한 PHP는 unregister_tick_function() 함수를 제공하여, 더 이상 필요하지 않은 함수와 틱 이벤트 간의 연결을 해제할 수 있습니다.
strict_types 지시어
PHP는 약타입(weakly typed) 언어이기 때문에 연산을 수행할 때 데이터 타입을 상황에 맞게 자동 변환합니다. 예를 들어 두 개의 정수 인자를 받아 그 합을 반환하는 함수가 있다고 가정해 보겠습니다. 호출 시 float 타입의 값을 전달하면 PHP 파서는 이를 자동으로 정수로 변환하여 처리합니다.
만약 이러한 강제 형변환(coercion)을 원하지 않는다면, declare 구문에 strict_types=1을 지정하면 됩니다.
예제 - 기본값(strict_types=0)
<?php
//strict_types의 기본값은 0입니다
function myfunction(int $x, int $y){
return $x+$y;
}
echo "total=" . myfunction(1.99, 2.99);
?>float 타입의 매개변수가 정수로 강제 변환된 후 덧셈이 수행되어 다음과 같은 결과가 출력됩니다.
실행 결과
total=3
반면, strict_types=1을 설정한 declare 구문을 사용하면 강제 형변환이 차단됩니다.
예제 - strict_types=1 적용
<?php
declare (strict_types=1);
function myfunction(int $x, int $y){
return $x+$y;
}
echo "total=" . myfunction(1.99, 2.99);
?>실행 결과
이 경우 다음과 같은 치명적인 오류(fatal error)가 발생합니다.
Fatal error: Uncaught TypeError: Argument 1 passed to myfunction() must be of the type integer, float given, called in line 7 and defined in C:\xampp\php\testscript.php:3
encoding 지시어
declare 구문의 encoding 지시어를 사용하면 스크립트 파일의 문자 인코딩 방식을 명시적으로 지정할 수 있습니다.
예제
<?php declare(encoding='ISO-8859-1'); echo "This Script uses ISO-8859-1 encoding scheme"; ?>
마무리
PHP의 declare 선언문은 코드 실행 방식을 세밀하게 제어할 수 있는 강력한 도구입니다. ticks로 주기적인 작업을 실행하고, strict_types로 엄격한 타입 검사를 활성화하며, encoding으로 스크립트의 문자 인코딩을 지정할 수 있습니다. 특히 strict_types는 PHP 7부터 도입된 기능으로, 타입 안정성이 중요한 프로젝트에서 버그를 사전에 방지하는 데 큰 도움이 되므로 실무에서 적극적으로 활용하는 것이 좋습니다.