2019年5月5日日曜日

PHP7も相変わらずウンコでビビった話

ここ丸1年ほど、ガッツリPHP7.2を触ってたが、あーもーこの言語駄目だ。とようやく明確に認識した。

もっとも大きいのは次の点だろう。

  • クラス定義がコンパイル時なのに<紛い物のOOP
  • ソース結合がランタイムであること<依然として「歯ブラシ」
例えば、クラスのstatic変数初期化に式を使いたいと思ったことない?それが出来ないのはコンパイル時クラス定義のせいだ。また同じ理由で、関数&クラス定義はスコープを貫通する。

端的に言えば、動的言語を標榜してるくせにちっとも動的じゃねえよってことだ。
これのお影で、仕様変更に弱い実装しか出来ない。非常に頑張りにくい。

例えば、既に出来上がってテストも済んでるソースに何か機能追加するには、そのファイルを修正するか、継承してほげほげするしかない。

前者は再テストが必要だし、後者は別のクラスになるため各処理の参照先を変えるのがかなりの手間。

であるにも関わらず、require/includeの元ファイルはすでにコンパイル済で、include先はこれから慌ててコンパイルする。故に、このinclude/requireを組み合わせて、動的にクラス生成管理をすることが出来ない。

後発の言語には、これらを援護する手段が大抵付いている。具体的には拡張メソッドがそれだ。PHPに拡張メソッドを付けるRFCが出てたけど、あれがどんなに役立つか知らんの、複雑な案件をやらされたことがありませんと言ってるようなものだ。

拡張メソッドっぽい記述はPHPでも __callとcall_user_func_argsを使えば実装は可能だ。が、可能だというだけで、これまたランタイム結合なので、これまた実行するまで関数名間違いに気づかない。IDEの恩恵を微塵も受けられない。static/裸function を呼ぶのといい勝負、って話になりかねん。

出稼ぎ先で、毎案件フルスクラッチから書いてるの馬鹿じゃねえのと思ってたけど、PHP使ってる限りは仕方ない。PHPを卒業するのが先だ。