ブックマークについて一先ず機能的な部分として、登録と解除、一覧・検索・通知といった基本的な機能がで揃ったので、現在はブックマーク一覧ページのフロント側を構成しています。
PHPで動いているシステムなので、サーバ側でレンダリングできる部分はレンダリングを任せるのですが、既存のコードを参考に書こうとしたらPHPの開始タグ終了タグで`<? ?>`と`<?= ?>`の両方が入り混じった形で見受けられました。
何か理由があって書き分けているのか特に何もないのか、分からなかったのでとりあえずイコールなしの記法で書こうとしたところVSCodeがシンタックスエラーを表示してきました。
## PHPタグについて
そもそもPHPは`<?php ?>`のタグ内にコードを記述していくのですが、htmlのタグなどを含まない場合は`<?php`だけでタグを閉じないのが推奨されているようです。
> ファイル全体が純粋な PHP コードである場合は、ファイルの最後の終了タグは省略するのがおすすめです。 終了タグの後に余分な空白や改行があると、予期せぬ挙動を引き起こす場合があるからです。 余分な空白や改行のせいで PHP が出力バッファリングを開始し、その時点の内容を意図せず出力してしまうことになります。
`<?= ?>`や`<? ?>`は上記のタグの省略形で本来は`php.ini`で`short_open_tag`が有効になっていなければ使えません。PHP5.4からは標準で`<?=`は使えるようになったようです。
[PHP: PHP タグ - Manual](http://php.net/manual/ja/language.basic-syntax.phptags.php)
今回既存のコードは`<?`が使えていたので、`short_open_tag`が有効でないわけではありませんでした。
## 原因
結局、何がおかしかったのかを見てみると、`<?=`の後にifやforといった予約語が続く場合はエラーが出るようです。
であれば推奨されていないが、`<?`に統一してしまおうと置換したところ今度は変数が展開できなくなりました。
## まとめ
`<?=`では予約語が使えず、変数は利用可能。`<?`は推奨されていない上に変数では利用できないということが分かりました。
プロジェクト上では従来のコードに合わせるのが良いと思うので`<?`も利用しますが、基本的には`<?php`と`<?=`を使う方が良さそうです。
## 余談
`<?php`と`<?=`では処理速度に違いがあるのか、また`<?php`タグを閉じた場合と閉じなかった場合での速度の比較結果があったので参考までに。
[phpでの出力「<?php echo $hoge; ?>」とその省略形「<?=$hoge?>」の速度を比較してみた | WEMO](https://wemo.tech/1226)
[php文の途中でhtmlを出力する時にphpタグを一度閉じるべきか、そのままechoで出力するべきかを速度比較で考察してみた。 | WEMO](https://wemo.tech/1552)
`<?php`は閉じないように意識して、ショートタグとの使い分けはエディタのチェック任せですかねえ。