지인에게 들은 이야기다. PHP 교육을 받는데, 첫 시간에 short_open_tag 옵션을 활성화하는 방법을 배웠다는 것이다.

short_open_tag 옵션을 활성화하면 php 코드를 시작하기 위해 <?php ?>라고 쓰지 않고 <? ?>라고 써도 된다. php라는 글자를 덜 칠 수 있게 되는 것이다. 그러나 당연한 말이지만 그 코드는 short_open_tag를 활성화하지 않은 서버에서는 돌아가지 않을 것이다.

물론 자기 서버에서 자기 코드만 돌리는 사람은 괜찮다고 생각할 수도 있다. 사실 많은 경우가 그럴 것이고, 그래서 short_open_tag 옵션을 활성화하고 사용할 것이다. 이 부분에서는 문제가 없다.

문제는 습관이다. 오랫동안 <?로 PHP 태그를 열어 온 사람은 워드프레스 플러그인 개발처럼 범용성이 필요한 프로젝트에서도 별 생각 없이 <?라고 PHP 태그를 열 것이다. 내가 그랬다.

이런 점을 고려한다면 그냥 <?php 로 PHP 태그를 여는 습관을 들이는 것이 낫다. 그러면 짧은 태그를 사용할지 긴 태그를 사용할지 고민하지 않아도 된다. 긴 태그는 모든 환경에 호환되기 때문이다.

즉, 가능한 모든 환경에 호환되는 코드를 작성하는 습관을 들이는 편이 좋다는 견지에서, 짧은 태그보다 긴 태그가 낫다.

타이핑하기 귀찮은 건 에디터의 자동완성을 이용해서 회피하자. PhpStorm의 경우 live template을 이용하면 된다.

XML과의 충돌은 큰 문제라고 하기 힘들다

사실 이 short_open_tag가 문제가 된 것이 xml 문서를 작성할 때 충돌을 일으키기 때문이었다.

<?xml version="1.0"?>
<? $date = date(); ?>

위와 같은 코드가 있다고 해 보자. 짧은 태그가 활성화돼 있으면 첫 줄에서 문제가 발생한다. xml 선언을 PHP 코드로 해석하기 때문이다. 그래서 이렇게 작성해야 한다.

<? echo '<?xml version="1.0"?>' ?>

이게 짧은 태그의 대표적 문제점으로 지적되는 요소인데, 내 생각엔 그냥 echo를 사용하면 회피되는 문제라 이걸 짧은 태그를 사용하지 말아야 할 근거로 삼는 건 설득력이 약해 보인다. 실제로 이 문제가 있음에도 불구하고 짧은 태그 사용은 줄지 않은 듯하다.

짧은 태그는 사용중단 예정인가? 아니다

몇 년 전에 어디선가 “PHP에서 짧은 태그를 곧 제거하게 될 테니 사용해선 안 된다” 하는 이야기를 봤는데, 공식 자료에서 확인할 수 없었다.

php.net의 설명

php.net의 short_open_tag 설명 부분에는 담백한 설명만 나온다. 아래는 번역이다.

PHP 여튼 태그의 짧은 형식(<? ?>)을 허용해야 하는지 PHP에 알려 준다. PHP를 XML과 섞어서 사용하길 원한다면 <?xml ?>을 [별도의 처리 없이 - 형우] 바로 쓸 수 있도록 이 옵션을 비활성화할 수 있다. 아니면 프린트해서 사용할 수 있다. 예를 들면 <?php echo '<?xml version="1.0"?> 하는 식으로 말이다. 또한, 이 옵션을 비활성화한 경우, 반드시 PHP 여는 태그의 긴 형식(<?php ?>)을 사용해야 한다.

주의:
이 설정값은 PHP 5.4 전까지는 <?php echo와 같은 기능을 하는 축약어 <?=에도 영향을 미쳤다. 이 축약어를 사용하려면 short_open_tag를 활성화해야만 했다. PHP 5.4.0부터는 <?=가 늘 사용가능하다.

즉, 짧은 태그가 사용 중단 예정이라는 이야기가 없다. 구글에서 php short_open_tag deprecated라고 검색해 봐도 관련한 공식 자료가 나오진 않는다.

축약어 <?= 사용 문제

오히려 PHP 5.4부터는 또 다른 축약어인 <?=short_open_tag 활성화 여부에 상관없이 사용할 수 있게 했다는 설명이 있다. 물론 5.4 미만에서는 short_open_tag가 활성화돼 있지 않으면 <?=를 사용할 수 없으니 호환성을 고려한 코딩을 끝까지 밀어 붙이면 <?=도 사용해선 안 되겠다는 결론을 낼 수도 있겠다. 나는 이 부분은 좀 고민중이다. 5.4 미만까지 고려한 습관을 들이는 것이 <?=를 사용하지 않아서 얻는 편의성보다 나은가. 단, 워드프레스 플러그인을 작성할 때는 5.4 미만에서 short_open_tag가 비활성화된 경우를 고려해 <?=를 사용하지 않는 편이 나을 것이다.

php.ini의 설명

PHP의 github 저장소에 있는 php.ini-production에서 찾은 내용은 php 공식 웹사이트의 설명보다 더 자세하다.

내용은 아래와 같다. 밑에 번역해 뒀다.

php.ini의 주석 내용

아래는 번역이다.

이 설정값은 PHP가 <??> 사이를 처리해야 할 PHP소스로 인식할지 말지를 결정한다. 일반적으로 <?php?>를 사용하고 이 기능은 끌 것을 권장한다. 이 옵션을 활성화하면 XML 문서를 생성할 때 문제를 일으킬 수도 있기 때문이다. 하지만 하위호환성 지원 때문에 기능은 남아 있다. 이 설정값이 <?= 축약 태그를 제어하지는 않는다는 점을 알아야 한다. <?= 축약 태그는 이 설정값에 상관없이 작동한다.

기본값: On
개발값: Off
제품값: Off

http://php.net/short-open-tag

즉, 하위호환성 지원 때문에 남겨 놨다는 이야기는 있어도 사용 중단 예정이란 이야기는 없다.

사실상의 기본값은 Off다

한 가지 첨언하자면, 설정을 하지 않았을 때의 기본값이 On이긴 하지만, PHP의 소스코드에서 찾을 수 있는 php.ini-production, php.ini-development에서 모두 값이 Off로 설정돼 있다. 그래서 사실상의 기본값은 Off나 다름 없다.