PHP 파일에서는 아래와 같이 <?php 태그를 열어 PHP 코드와 문법을 사용할 수 있다.
<?php
echo "Hello";
너무 기본적인 문법이지만, PHP에는 short_open_tag라는 설정이 존재한다.
이 설정에 따라 <?(Short Open Tag)를 PHP 코드의 시작으로 인식할지 여부가 결정된다.
PHP에는 코드를 시작하는 태그가 두 가지 있다.
<?php
echo "Hello";
항상 사용할 수 있는 PHP의 표준 태그이다.
<?
echo "Hello";
<? 형태의 태그는 Short Open Tag라고 부른다.
하지만 이 문법은 short_open_tag 설정이 On일 때만 사용할 수 있다.
php.ini 파일에서 다음과 같이 설정되어 있다.
short_open_tag=On
또는
short_open_tag=Off
<?php와 <? 모두 사용 가능<?php만 사용 가능최근 CodeIgniter 3 프로젝트를 로컬 환경에서 실행하는데 아래와 같은 Parse Error가 발생했다.
ParseError: syntax error, unexpected ...
실서버에서는 정상적으로 동작했기 때문에 처음에는 PHP 버전이나 내장 서버(php -S)의 문제라고 생각했다.
하지만 원인은 의외로 단순했다.
뷰 파일에 아래와 같이 <? 태그가 두 군데 사용되고 있었고,
<?
if ($isLogin) {
...
}
로컬 환경의 PHP는 short_open_tag=Off 상태였기 때문에 <?를 PHP 코드가 아닌 일반 문자열처럼 해석하면서 문법 오류가 발생한 것이다.
해당 부분을 모두 표준 태그로 변경하니 문제가 바로 해결되었다.
<?php
if ($isLogin) {
...
}
php -S)가 원인일까?결론부터 말하면 아니다.
내장 서버가 <?를 인식하지 못하는 것이 아니라, 내장 서버가 사용하는 PHP의 설정(php.ini)이 short_open_tag=Off였던 것이다.
즉,
short_open_tag=On → 정상 동작short_open_tag=Off → Parse Error 발생처럼 환경 설정의 차이 때문에 동일한 코드가 다르게 동작할 수 있다.
<?=는 왜 동작할까?많은 사람들이 헷갈리는 부분인데,
<?= $title ?>
는 Short Open Tag와는 별개의 문법이다.
PHP 5.4부터는 <?= 태그가 항상 활성화되어 있기 때문에 short_open_tag 설정과 상관없이 사용할 수 있다.
즉,
short_open_tag=Off
이어도 아래 코드는 정상적으로 실행된다.
<?= $title ?>
하지만
<?
echo $title;
는 short_open_tag=On일 때만 사용할 수 있다.
현재는 대부분의 프로젝트에서 <? 대신 항상 <?php를 사용하는 것을 권장한다.
그 이유는 다음과 같다.
기존 레거시 프로젝트를 유지보수한다면 <?가 남아있는 경우가 종종 있다. 새로운 코드를 작성하거나 리팩터링할 때는 <?php로 통일해 두는 것이 가장 안전한 방법이다.