ここ丸1年ほど、ガッツリPHP7.2を触ってたが、あーもーこの言語駄目だ。とようやく明確に認識した。
もっとも大きいのは次の点だろう。
端的に言えば、動的言語を標榜してるくせにちっとも動的じゃねえよってことだ。
これのお影で、仕様変更に弱い実装しか出来ない。非常に頑張りにくい。
例えば、既に出来上がってテストも済んでるソースに何か機能追加するには、そのファイルを修正するか、継承してほげほげするしかない。
前者は再テストが必要だし、後者は別のクラスになるため各処理の参照先を変えるのがかなりの手間。
であるにも関わらず、require/includeの元ファイルはすでにコンパイル済で、include先はこれから慌ててコンパイルする。故に、このinclude/requireを組み合わせて、動的にクラス生成管理をすることが出来ない。
後発の言語には、これらを援護する手段が大抵付いている。具体的には拡張メソッドがそれだ。PHPに拡張メソッドを付けるRFCが出てたけど、あれがどんなに役立つか知らんの、複雑な案件をやらされたことがありませんと言ってるようなものだ。
拡張メソッドっぽい記述はPHPでも __callとcall_user_func_argsを使えば実装は可能だ。が、可能だというだけで、これまたランタイム結合なので、これまた実行するまで関数名間違いに気づかない。IDEの恩恵を微塵も受けられない。static/裸function を呼ぶのといい勝負、って話になりかねん。
出稼ぎ先で、毎案件フルスクラッチから書いてるの馬鹿じゃねえのと思ってたけど、PHP使ってる限りは仕方ない。PHPを卒業するのが先だ。
もっとも大きいのは次の点だろう。
- クラス定義がコンパイル時なのに<紛い物のOOP
- ソース結合がランタイムであること<依然として「歯ブラシ」
端的に言えば、動的言語を標榜してるくせにちっとも動的じゃねえよってことだ。
これのお影で、仕様変更に弱い実装しか出来ない。非常に頑張りにくい。
例えば、既に出来上がってテストも済んでるソースに何か機能追加するには、そのファイルを修正するか、継承してほげほげするしかない。
前者は再テストが必要だし、後者は別のクラスになるため各処理の参照先を変えるのがかなりの手間。
であるにも関わらず、require/includeの元ファイルはすでにコンパイル済で、include先はこれから慌ててコンパイルする。故に、このinclude/requireを組み合わせて、動的にクラス生成管理をすることが出来ない。
後発の言語には、これらを援護する手段が大抵付いている。具体的には拡張メソッドがそれだ。PHPに拡張メソッドを付けるRFCが出てたけど、あれがどんなに役立つか知らんの、複雑な案件をやらされたことがありませんと言ってるようなものだ。
拡張メソッドっぽい記述はPHPでも __callとcall_user_func_argsを使えば実装は可能だ。が、可能だというだけで、これまたランタイム結合なので、これまた実行するまで関数名間違いに気づかない。IDEの恩恵を微塵も受けられない。static/裸function を呼ぶのといい勝負、って話になりかねん。
出稼ぎ先で、毎案件フルスクラッチから書いてるの馬鹿じゃねえのと思ってたけど、PHP使ってる限りは仕方ない。PHPを卒業するのが先だ。