PHP
言語設計

PHPの関数の引数の整合性

(この記事はエキサイトAdvent Calendar 2017の最初の記事です。)

2015年のPHPカンファレンスでPHPの作者、ラスマス・ラードフ氏にインタビューを行いました。この記事はそのインタビュー内容が掲載された記事「PHPの生みの親,ラスマス・ラードフ氏インタビュー」から関数の引数の整合性に関して語った部分を引用したものです。

「関数の引数の整合性」はPHPの言語設計に対する批判としてよく挙げられるものですが、PHPの作者がどのように考えてるのかを知るために該当部分を抜粋しました。

--

PHPはテクノロジーへのショートカットにすぎない

... PHPは一人で保守するには大きくなりすぎました。もし私がコントロールを維持するために,パッチはすべて自分を通さないと出せないようにしていたら,とうていやっていけなかったでしょう。そもそも私は面倒くさがり屋ですし,PHPはサポートする範囲が広すぎます。私は20種類ものデータベースをそれぞれ熟知しているわけではありませんから。たとえば,Oracleのエンジニアがパッチをサブミットして,Oracleの何とかかんとかのために,これを変更したいと言ったとします。それをどうすべきか私には判断できません。適用したほうがいいかもしれないが,そうでないかもしれない。Oracleのエンジニアは修正する必要があると言っている。PHPの多くの部分は,何人もが日夜取り組んで作りあげたものです。

私が一人で作るよりずっとよくできているコンポーネントにあれこれ手出しをしてボトルネックを作るのは,合理的だとは思いません。PHPとは実のところ,個別に開発されたパーツの寄せ集めなのです。整合性がないように見えるのは,それぞれ独立したチームが開発しているからで,Oracleに関することはOracleエンジニアたちがやっているのです。MySQL拡張モジュールはMySQLの人々が作りました。必ずしも互いに話し合う必要はないのです。たとえば,PHPにはPDOがありますが,これはあまり優れた抽象化レイヤではありません。多少の抽象化は試みましたが,本気でOracleやMySQLを使いたい人はMySQLiやOCIなどのネイティブインターフェイスを使うでしょう。どちらもそのデータベースを熟知して毎日使っている人々が書いたものです。だから整合性はなくても,どのモジュールもそれぞれ非常によくできているのです。

モジュール間での共通性には欠けるかもしれませんが,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はそういうふうに開発されたものですから。