Edited at

【PHP8】short_open_tagにさよなら、しないかも?

Deprecate PHP Short open tagsというRFCが投票フェーズに入りました。

投票期間は2019/04/10から2019/04/24、採択には投票数の2/3+1の賛成が必要です。


Deprecate PHP Short open tags


Short open tagsとは

PHPの開始を示すタグは<?php、もしくは<?=です。

後者は<?php echoとほぼ同じであり、今回のRFCでは一切影響を受けません。

php.iniの設定でshort_open_tagを有効にすると、PHPの開始タグを<?と省略して書けるようになります。

// 通常

<?php
echo 'hoge';

// short_open_tag=1ならこう書ける
<?
echo 'hoge';


Short open tagsのデフォルト値

PHP7.3時点では1、つまり初期設定で有効になっている。

ただし、多くの実装系(XAMPPとか)では0と無効にされているようだ。


Short open tagsの問題点

うっかりXMLをコピペすると死ぬ。

<?xml version="1.0"?>

<?php
echo 'XMLの中身';

このコードは、short_open_tagが有効な場合syntax errorのE_PARSEになります。

short_open_tagが無効であれば普通にXMLが出力されます。

このように、設定によって動作が根本的に変わってしまうので、あまりよろしくありません。


Remove alternative PHP tags

PHP5時代は、これ以外にも<%<script language="php">といった記述でPHPに入ることが可能でした。

それらはPHP7移行の際に、Remove alternative PHP tagsのRFCで削除されました。

が、なぜか<?だけは残ったままでした。


RFC

<?をPHP7.4でDeprecatedにし、PHP8で削除しよう、という提案です。

これによってPHPの開始タグは<?php<?=の2種類だけになり、とてもすっきりします。


プルリク

PHP7.4ではshort_open_tagのデフォルト値を1から0に変更します。

また有効にするとDirective 'short_open_tag' is deprecatedのE_DEPRECATEDが発生するようになります。

PHP8では設定項目そのものが削除され、有効にすることができなくなります。


internal

「え?short_open_tag削除して常に有効になるんじゃないの?」

「わざわざ削除するメリットが見当たらない」

「今PHP7で書いてる人はほぼ影響受けないだろうけど、未だにPHP5の人はアプデの障壁がさらに高くなるよ。」

「Facebookでアンケ取ってみたら96%が削除賛成だったよ」

<?=が削除されないんだったらかまわない」


投票

2019/04/12時点では、PHP7.4でのDeprecateは賛成17反対9で、このままだと却下されます。

PHP8でのRemoveは賛成19反対9で、このままだと受理されます。


感想

PHP7.4でのDeprecateが却下され、かつPHP8でのRemoveが受理されると、それまで使えてたのにPHP8でいきなり削除ってなるんだけどどうなんだろう。

その場合はPHP8でDeprecateになるのかな?

個人的には<?は全く使ってないので消してもらって全くかまわないんだけど、その結果vendor配下からDeprecatedが大量発生ってなったりすると困りますね。

かつてPEARでもAssigning the return value of new by reference is deprecated湧き潰しできず死ぬという事件がありましたが、それの再来にならないことを祈りましょう。