Attacking PHP
PHPがいかに駄目な言語か、という話。
2024年にはどうか
いろんなものがfalseだったりするせいで、新たな比較演算子「===」が必要
その通り
hashやlistがobjectが区別できない
objectは当時から区別できるので、事実誤認では。
それまでもユーザーランドの静的解析でlist型として慣習的に扱われていた オブジェクト指向機能が壊れている
PHP 4時代のOOPは「壊れていた」かはともかく、一般的なOOP言語の振る舞いと違って使いにくかったのは確か lambda(無名関数)がない。create_functionはlambdaじゃない
わざわざ墓穴から掘り起こさない限りは…………。
short_open_tagsやらsafe_modeやらregister_globalsがonになってるかもしれない
一貫性のない名前(str_replace,strlen,parse_strとか)
引数の順番がわかりにくい(in_arrayとかstrposとか)
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はそういうふうに開発されたものですから。
そういうものです。
strpos('abcd','a')は0を返すが、0は偽である
PHPで書かれたたくさんのアプリがあるがどれもHTMLとロジックが分離されてない(本当?)
CGIで書かれたたくさんのアプリがあった時代はそうかもしれないですね… 2010年代後半以降はほとんどのPHPアプリケーションはLaravelとかSymfonyとか何がしかのフレームワークかCMSかが使われている(ことが多い)のはRailsなんかと変わらない PHPはフレームワークの制約を無視してCGIっぽく書けてしまうのが問題なんだけど‥
「PHPは初心者に学びやすい」と言われる。確かにそうかもしれないが、 おかげでどれだけのSQLインジェクションやらXSS脆弱性やら、 ひどいコードが放置されていることか
グローバル。使うんじゃないってば。
使うんじゃない!
個人的にはRails抜きでSinatra+mysql2とかで書かれたアプリケーションもなかなかだと思うけど定量的なデータを出せないので異論はない
もちろん、反論もあるだろう。たとえば「Defending PHP」とか。
でも、個人的にはやはり否定側の方が筋が通ってる印象かな。
の、ノーコメント…