PHPの関数定義はこんな変態的な書き方ができる

すまん変態的は言い過ぎた。
この書き方を常用してる人がいたらごめんなさい。
けど書いてみたらとっても新鮮な感じがしたので。

開始と終了

まず大前提として、
PHP では開始タグ <?php 以降の部分が PHP として評価され、
開始タグより前の部分や終了タグ ?> より後の部分はそのまま出力されますね。

これを実行すると、こんな具合になります。(改行は一部省略)

ここはそのまま出力される
PHP で echo しています
ここもそのまま出力される
ここも PHP の世界

このファイルを直接開いても、
別のファイルから include / require しても同じことですね。

PHP を書く人にとっては当たり前だと思いますけど念のため。

関数定義の中でやってみる

では関数定義の最中に閉じタグ ?> を入れるとどうなるか。

この場合、何も出力されません。

確かに PHP ファイル内で <?php ?> の外に文字が入ってるけど、
この部分は関数定義の中にあるので、呼び出されるまで評価されない。

呼び出してみる

じゃあ呼び出してみよう。

出る。

毎日暑いですね!
そうですね!

理屈はわかる

よく「HTML の中に PHP を埋め込む」という表現が使われるけど、
実際には PHP はそのファイル全体を開くのであって
単に <?php ?> の間は PHP のコードとして評価され
その外側の部分はそのまま出力されるというだけなので
出力する部分が関数定義の中にあれば
そこは関数の領域として扱われますよねそりゃ。

ベタ書きするのが見慣れないだけで、
ビューテンプレートなんかの処理をするときに
テンプレートファイルを include するのと
やってることは同じ。

使い途を考えてみた

せっかくだから何か使い途はないかと考えてみました。
そしたらあった。使える場面が。

使うことをお勧めはしないけど、でも使える。

HTML から関数へ移動させたい

例えば WordPress などの場合。
テンプレート内にこういう部分があったとします。

テンプレートに置いとくと使いにくいので
functions.php に移すことにしたとします。

普通に関数を作る場合

もちろん上記の HTML を直接置いてもだめで、少し修正する必要があります。

  • 全体を echo する
  • the_permalink()the_title() は自動で出力を行う WordPress の関数なので、値を返す関数 get_permalink() / get_the_title() に変える
  • <?php ?> の部分は、文字列をつなぐ処理に変える

こんな感じですか。

関数途中閉じを使うとこうなる

でもさっきの変な書き方を使えば、
テンプレートにあった部分をそのまま移動できる。

何だか変な感じだけど、これで動きますね。

return もできるしフィルターフックも使える

上記では文字列をそのまま出力しているので
できた文字列を return することができませんね。

これだと WordPress のフィルターフックなども使えない。

けど出力バッファリングを使ってこんな具合にしたら共存も可能です。

できた。

副効果: カラーリング

この書き方の副効果として、
シンタックスのカラーリングが効くというのもありました。

ヒアドキュメントなんかで書くと
すべて単なる文字列として扱われるから全部同じテキストの色になるけど、
多くのエディタでは ?> で PHP を閉じた後は HTML として扱われるから
ちゃんと HTML としての色分けが効く。

エディタによっては “…” 内なら HTML に色づけをしてくれるみたいだし
ヒアドキュメントでもやってくれるやつもあるのかもしれないけど、
手元で見た限りはこの書き方が一番見やすかった。

インデントが気に入らない場合

PHP のコードと HTML の部分でインデントが揃わないから気に入らないという場合
もうこんなふうにしてはどうか。

こうなってくるともはや
<?php が開始タグで ?> が終了タグというより

  • ?> は出力開始
  • <?php は出力終了

とみなした方がわかりやすい気がしてきた。

そういえばこれを使えば
ヒアドキュメントの終端 ID の行でインデントができないという問題も解決しますね。

何がダメなのか

「使うことをお勧めはしない」って書いたけど、
でも HTML 文字列を echo したり変数内に格納したりするのと同じ処理ができるし、
同じように return できるしテストも通るし、
実用的な問題としてダメなところってどこだろう。

何かやらない方がいいような感じがする理由って
「見慣れないから」というのが一番大きいんじゃないかという気がしてきた。

しばらく続けて使ってみたら、当たり前になって
「問題ない」という感覚になるんじゃないだろうか。

誰かやってみてください。

そうそう PHP といえば

こちらもよろしくお願いします!

  • このエントリーをはてなブックマークに追加