Attacking PHP
2008年にまつもとゆきひろ氏によって書かれたエッセイ。
Attacking PHP - Matzにっき(2008-01-26)
PHPがいかに駄目な言語か、という話。
2024年にはどうか
以下の見解は@tadsanによる私見である。
いろんなものがfalseだったりするせいで、新たな比較演算子「===」が必要
その通り
hashやlistがobjectが区別できない
objectは当時から区別できるので、事実誤認では。
hash(PHPでは連想配列)とlistはPHP 8.1でarray_is_list()関数が追加されて標準関数で識別できるようになった
それまでもユーザーランドの静的解析でlist型として慣習的に扱われていた
PHP 8でも型宣言として扱えるわけではない
オブジェクト指向機能が壊れている
PHP 4時代のOOPは「壊れていた」かはともかく、一般的なOOP言語の振る舞いと違って使いにくかったのは確か
LL2003: 「PHPにおけるオブジェクト指向「的」機能の特徴」とか呼ばれちゃう始末
lambda(無名関数)がない。create_functionはlambdaじゃない
PHP 5.3でClosureクラスと無名関数式が追加されて無事にレキシカルスコープが扱えるようになった
わざわざ墓穴から掘り起こさない限りは…………。
2020-12-10: PolyfillでPHP8にPHP4の魂を吹き込む
short_open_tagsやらsafe_modeやらregister_globalsがonになってるかもしれない
safe_modeとかregister_globalsとかそういう激ヤバ機能は葬り去られた
short_open_tagsは… 銀河大戦の引き金になりました
P++: 銀河に平和をもたらすための奇策と決着 #PHP - Qiita
一貫性のない名前(str_replace,strlen,parse_strとか)
引数の順番がわかりにくい(in_arrayとかstrposとか)
ラスマス・ラードフ曰く… 垂直方向の整合性
PHPの生みの親、ラスマス・ラードフ氏インタビュー | gihyo.jpより
PHPは垂直方向に見れば整合性がある
ラスマス:(前略) PHPとは実のところ、個別に開発されたパーツの寄せ集めなのです。整合性がないように見えるのは、それぞれ独立したチームが開発しているからで、Oracleに関することはOracleエンジニアたちがやっているのです。MySQL拡張モジュールはMySQLの人々が作りました。必ずしも互いに話し合う必要はないのです。
(中略)
モジュール間での共通性には欠けるかもしれませんが、OCI拡張モジュールもMySQL拡張モジュールも、下で動いているC APIにほぼ1対1で対応している点において整合性があるといえます。MySQLドキュメントのC APIに関する部分を見てみれば、PHP開発者にとってはなじみ深く感じられるはずです。どの低レベル関数もPHP側の何かと対応しているからです。だからPHPは垂直方向に見れば整合性はあるのですが、多くの人から始終「PHPはまったく整合性がない」と言われます。整合性は確かにあるのです。ただ、人々が思っているような水平方向にはないというだけです。垂直方向に見れば、完璧な整合性があります。
ラスマス:たとえば文字列関数。UNIXコマンドラインでmanしてstrchrの項を見てみると、UNIXとCとではstrchr関数の引数の順序も書式もまったく同一なことが分かります。どちらも同じライブラリをベースにしているのですね。水平方向に見れば両者に整合性はありませんが――おそらくあのライブラリ群を作った人たちは互いにあまり話し合わなかったのでしょう。
私たちがPHPの整合性のなさを直さないと言ってよく非難する人がいますが、PHPはそもそもそれが問題になるようなものではないのです。PHPは結局、ライブラリやその他基盤となっているテクノロジーへのショートカットにすぎません。それなのに、どうして誰もがPHPレベルでの整合性を求めるのか、私には分かりません。整合性をとるのはフレームワークの役割です。フレームワークは問題を解決するための全体的なアプローチを定める場所ですから。PHPはその下のレベルにあって、ただ低レベルにあるライブラリとか関数とかへのアクセスを提供するだけの存在です。こう言っても多くの人は同意してくれないんですが、PHPはそういうふうに開発されたものですから。
そういうものです。
parse_str()もin_array()もlibc関数じゃないって…? それはそう
strpos('abcd','a')は0を返すが、0は偽である
ルーク、PHPStanを使え!
https://phpstan.org/r/b67068fc-2494-421d-80cb-f5618dcfd507
あとstr_contains()も使え!
PHPで書かれたたくさんのアプリがあるがどれもHTMLとロジックが分離されてない(本当?)
CGIで書かれたたくさんのアプリがあった時代はそうかもしれないですね…
2010年代後半以降はほとんどのPHPアプリケーションはLaravelとかSymfonyとか何がしかのフレームワークかCMSかが使われている(ことが多い)のはRailsなんかと変わらない
PHPはフレームワークの制約を無視してCGIっぽく書けてしまうのが問題なんだけど‥
「PHPは初心者に学びやすい」と言われる。確かにそうかもしれないが、 おかげでどれだけのSQLインジェクションやらXSS脆弱性やら、 ひどいコードが放置されていることか
グローバル。使うんじゃないってば。
使うんじゃない!
個人的にはRails抜きでSinatra+mysql2とかで書かれたアプリケーションもなかなかだと思うけど定量的なデータを出せないので異論はない
もちろん、反論もあるだろう。たとえば「Defending PHP」とか。
でも、個人的にはやはり否定側の方が筋が通ってる印象かな。
Defending_PHP
の、ノーコメント…