エンジニアHubproduced by エン

若手Webエンジニアのための情報メディア

これから先もPHPで戦うために、なにを使い、なにを学ぶべきか - 廣川類に聞くPHP学習に大事なこと

Webアプリケーション開発言語として広く使われるPHP。黎明期から浸透していくまでの過程、そして、これから先もPHPを活用していくために必要なこと、をエキスパートの廣川類さんに聞きました。

PHP廣川類さんメインカット

本記事は2020年3月に実施した遠隔取材をもとに構成しています。

1995年の公開以降、PHPは多くの企業、サービスで採用され、エコシステムが拡大してきました。言語の歴史に比例するように、さまざまなサービスのなかで積み重なってきたPHPのシステムを、いかにして持続/発展可能なものとするか。おそらく、多くのPHPユーザが感じる疑問をエキスパートにぶつけます。

今回お話を伺った廣川類( ひろかわ・るい )さんは、本業は制御関連のエンジニアであり、PHPへの関わりは、「あくまで個人の活動」と表現します。しかし、その活動は趣味の範囲を超え、日本PHPユーザ会の立ち上げ、さまざまな企業のPHPカウンセリングなど、PHPの文脈と動向を直視してきました。現状を肌で知るエキスパートに、これからのPHPの生存戦略を伺いました。

廣川 類さん(ひろかわ・るい)@rui_hi

廣川類さんアイコン
1996年に当時まだPHP/FIと呼ばれていたPHPに出会い、そのシンプルで高機能なところが気に入り、PHPマニュアルの翻訳などを手がける。その後、『PHP徹底攻略』(通称:マンモス本)の執筆者の1人となり、日本PHPユーザ会の立ち上げにも関わる。現在もPHPのホビーユーザとしてPHPのマルチバイト拡張mbstringの開発などに携わっている。

つぶさに見てきた、日本のPHPコミュニティの誕生と成長

──まずは廣川さんとプログラミング、そして、PHPとの出会いについて教えてください。

廣川 私はもともとがWebプログラマではなく、航空宇宙系の制御関連の開発をするエンジニアでした。

そして、最初のプログラミングとの出会いは、インターネット1996ワールドエキスポジション*1の開催に伴って行われたNTTの回線のキャンペーンでした。このキャンペーンではNTTのインターネット回線を使える特典があり、今で言う食べログのような口コミ情報を扱うサーバを立ち上げたのが最初だったと思います。ただ、当時はPHPではなく、Perl CGI+Mini SQL+NCSA httpdによるWeb+DBサーバで構築しました。

その後、負荷が高くなり海外のサーバへの移行を考えるようになったのですが、当時のFreshmeat(現Freecode)という情報サイトでPHP/FI(Form Interpreter)、そして、出始めたころのMySQLの存在を知り、移行したのが、私が初めてPHPに触れたきっかけです。

──廣川さんとPHPの関わり方は、出会いから今まで、ずっと個人活動として続いているわけですね。日本では、その後、2000年に日本PHPユーザ会が立ち上がり、廣川さんご自身も発起人の一人として関われました。その当時の国内のPHP界隈の様子について教えてください。

廣川 私がPHPと出会ったころは、いくつかの大学や企業で徐々にインターネットが活用され始めた、いわば黎明期で、まだPHP(PHP/FI)に関する日本語の情報は少なかったですね。

ですから、自分の勉強と調査を兼ねて、海外のドキュメント翻訳をスタートしたのですが、せっかく訳したのだから、Webで公開したんです。こうした活動が、今にいたるまでの自分の礎になっていると感じます。PHP/FIに限らず、MySQLもほとんど情報がなかったので、同じように日本語情報を公開していきました。

──情報を独り占めしよう、とは考えなかったのですね。

廣川 私自身、大学時代から数値計算や最適化に関する分野を専攻する中でインターネットに触れる機会が多く、当時からインターネットに根付いていたフリーソフトウェアの文化には親しみがありました。ですから情報公開に抵抗はありませんでしたし、問い合わせが来たときに対応する、といった双方向のコミュニケーションにもすぐに馴染めました。

──日本のPHPコミュニティはどのように形成されていったのでしょうか。

廣川 1998~1999年ごろ日本でLinuxブームが起き、その影響からLinux以外のOSSも含めてイベントやカンファレンスが開催されるようになりました。こうした流れから、PHPに興味を持ったエンジニア・プログラマが集まり、2000年4月の日本PHPユーザ会設立の契機となり、石井達夫さんや堀田倫英さんにお会いして、マンモス本(『PHP4徹底攻略―Webとデータベースの連携プログラミング(ソフトバンククリエイティブ/2000)』の通称)の執筆へとつながっていきました。

こうして振り返ってみると、Web開発言語であるPHPは、私にとってインターネットの文化とともに成長してきたと感じますし、また、PHPコミュニティはOSSコミュニティが醸成されていく過程と重なるように思います。

自分で開発したものが世界に発信されたPHP4、利用者の意識が変わったPHP5.3/5.4

──PHPの言語の進化をつぶさに見てこられて、言語としてのPHPの印象、ターニングポイントと感じたことがあれば教えてください。

廣川 自分自身が開発に関わったという点で、最も記憶に残っているのはPHP 4のリリースと日本語対応です。PHP/FI、そしてPHP 3とリリースが続いていきいましたが、日本語対応は正式に行われていませんでした。そこで、自分で作ってみようと、jstringというPHPで日本語のようなマルチバイトを扱える機能を開発し始めました。

そして、PHP 4のリリースのタイミングになり、PHPの生みの親であるRasmus Lerdorf(@rasmus)と連絡を取り合うようになり、jstringをPHP本体に正式にマージしてもらえることになったのです。ちなみに、jstringはJavaに同じ名称の機能があったので、PHPではmbstringと名称変更され、今に至っています。

──国内のPHPユーザにもインパクトがあったでしょうね。

廣川 自分が開発したものが、世界に広がる、発信できるというのはエンジニア冥利に尽きますね。当時を振り返ると、かなりの時間をかけてPHPの開発にコミットしていましたし、(発展途上の言語だったがゆえに)PHPの開発を純粋に楽しんでいました。

業務で関わっている制御系・航空宇宙系の開発は、時間をかけじっくり取り組むケースが多かったので、PHPやWebの世界のスピード感はまったく別物でした。この違いを経験できたことは、エンジニア / プログラマとしての自分に非常にいい影響があったように思います。

──開発とともに言語の成長をご自身の成長と照らし合わせて楽しまれていたのが伝わります。廣川さんご自身が初めてPHPにコミットしたものはどういったものですか?

廣川 本当の最初、ということであれば、PHP Manualです。今もPHP.netにあります。私がマニュアルの制作に関わったときは、A4サイズで800枚程度の情報量だったと記憶しています。今はどのぐらいでしょうか……、興味のある方はぜひ目を通してみてください。

他には、前述のmbstringは、最初期から開発にコミットしていますし、今もGitHubリポジトリのコントリビュータとして大部分に関わっています。

遅い?機能が不十分?PHPをめぐる賛否の文脈

──ところで、PHPというと他の言語との比較をされ、その賛否がいくども議論されてきた印象があります。廣川さんご自身はなにかご意見はありますか。

廣川 おっしゃるとおり、日本では、Perl / Ruby / Pythonと並んで4大LL(Lightweight Language)という視点で比較された時期もありました。また、言語としてのベンチマークが遅い時期も確かにあったので、実行速度に関しては議論を呼びやすかったのでは、と思います。

PHP4が登場したころは、とくにPHPの実行速度の遅さを指摘する声を聞いた印象があります。その後のPHP 4.3で、コア開発者であるAndrei Zmievski( @a )を中心に実行エンジンの改良が行われ、約30%の高速化が実現したのですが、それでも遅いという声があったのです。

そこで、Andi Gutmans(@andigutmans)とZeev Suraski(@zeevs)が共同で創業したZend Technologies Ltd.が、Zend Engineの改良を進め、PHP 5.1ではPHP 4に比べて50%以上高速化されています。このように、バージョンアップごとに速くなり、PHP 7では他の言語と比較しても、かなり速い部類に入ると考えています。

ただ、実行速度の優劣に関しては言語だけで結論づけるのは難しいと思います。CPUなどハードウェアに適した言語アーキテクチャであるかどうか──これも非常に重要な視点ですし、ハードウェアそれ自体も進化・変化しているので、一定条件のみで言語の処理速度を議論することは、それほど大切ではないと考えます。

また、実際のユースケースを考えると、プログラミング言語の処理速度よりも、その言語を使ったシステム全体の処理速度の方が重要です。そのためには、WebサーバやDBサーバ、さらに、その上にあるアプリケーションのチューニングなど、全体での最適化や高速化に目を向けるべきでしょう。

──機能面での議論も重ねられてきた印象があります。

廣川 PHPにはオブジェクト機能や名前空間などの現代的なプログラミング言語が備えているべき機能がサポートされていない、という類の意見をよく聞きましたが、PHP 5ではオブジェクト機能が大幅に強化されています。その後、PHP 6としてリリースされる予定だった機能が、PHP 5.3 / 5.4でバックポートの形でリリースされるなど、言語として成熟するとともに、機能的に劣っているという声を聞かなくなりました。

──PHP 5.3 / 5.4では具体的にどのような機能が追加されたのでしょうか。

廣川 PHP 5.3では、名前空間、クロージャ、オブジェクト処理およびオブジェクト指向などが実装され、PHP 5.4では、組み込みWebサーバが追加されました。ようやく、プログラミング言語として必要な要素が整ったわけです。

──バージョンが積み重なってくると、言語としては洗練されてきますが、同時にユーザにとってはレガシー化の懸念もあります。

廣川 レガシー化の懸念とは、旧バージョンの扱いのことでしょうか。確かに、長期で運用しているサイトやサービスでは、いまだにPHP 4系、5系で動いているものも多数あります。そして、いずれのバージョンもすでにサポートが終了しています。

PHPの特徴の1つに、サポートが終わると、開発側ではすべて対応しなくなる点が挙げられます。他の言語で見られるLTS(Long Term Support)の考え方はPHPにはなく、アップデートすると、古いバージョンのサポートを終えます。

ですから、ユーザ自身が責任を持って対応していかなければなりません。人それぞれではありますが、サポートという作業は、新規の開発に比べてモチベーションを上げづらいので、新しいバージョンが出た場合、アップデートしていくことも1つの考え方だと私は思っています。

それでも、たとえば、実行速度に関して言えばPHP 4よりPHP 7のほうが格段に早いにもかかわらず、アップデートできない事情があるサービスやプロダクトもあるでしょう。その場合は、プロダクトオーナーなどの責任者が早めに指針を決め、その先を考える必要があるでしょう。

PHPが求めるのは先鋭的な機能ではなく、開発者・ユーザの利便性──Rasmusの理念

──今のお話を聞いて、PHPはプログラミング言語として突き詰めるというよりは、使用される状況、また、開発を担うプログラマにとって最適な結果を提供するためのプログラミング言語として、開発、進化しているような印象を受けました。

廣川 まさにそのとおりです。PHPは開発者であるRasmusの頭の中そのものと言ってもいいかもしれませんね。Rasmusが目指したのは、ユーザにとっていかに便利であるか、その一点です。ですから、「開発しやすい」「扱いやすい」といったキーワードをもとに機能が追加されてきました。現在ではユーザが増え、大規模なソースコードを抱える言語になり、多くの開発者が関わるようになりましたが、Rasmusの思想は踏襲されています。

そして、開発当初の目的通り、PHPはWebに特化している。これもブレずに継続されてきた思想です。もっとも、この思想を大事にしてきたゆえ、Web開発以外の目的、たとえば、機械学習だったり、大規模エンタープライズシステムには向きません。PythonやJavaなど、用途ごとに適した他の言語がありますので、そちらを使用するべきでしょう。

仕組みを自分で理解する意識、そして、つねに楽しむ心、プログラマにはそれが求められる

──PHPの歴史、込められた思想がよくわかりました。では、プログラマとしてPHPを学ぶべきときに意識することを教えてください。

廣川 繰り返しになりますが、PHPはWebに特化したプログラミング言語ですので、Web開発という目的で使ってもらうことが大前提です。

そのうえで、私がこれまでどのように学んできたか、また、今もどのように学んでいるかをお話します。前述の通り、私がPHPに触れた始めたころは日本語情報がまったくなく、英語のドキュメント、マニュアルを読みながら、言語の記述を学びました。

今は多くのメディアや出版社、開発者の尽力で豊富な書籍や文献がありますから、まずは、そういったものを読むことがいいですね。初めてであれば、初心者向けの解説書、もう1つ踏み込んでみたいのであれば、PHPのマニュアルを読みすすめることをオススメします。

そして、さらにPHPについて知りたい、学びたいということであれば、他の方が書いたコードを読むのが良いのではないでしょうか。 たとえば、PHP Conferenceという、日本全国のPHPer(PHPプログラマ)が一堂に会するイベントがありますが、そこで発表されている内容や資料を見ることも良いでしょう。

──より深くPHPを学ぼうと思ったら、どのようなアプローチがあるでしょうか。

廣川 PHPの言語としての特性について深く知りたい、アーキテクチャを学びたいということであれば、2つ方法があります。まずは、PHPに付属されているテストコード・テストベンチを、自分で実行することです。とくにPHP用のデバッガなどを使ってトレース実行しながら動いているコードの様子を見ることは、言語の裏側を見ることができます。

▼アルゴリズム系のコードサンプル。 フィボナッチ数列(Zend/tests/generators/fibonacci.phpt)

<?php
function fib() {
    list($a, $b) = [1, 1];
    while (true) {
        yield $b;
        list($a, $b) = [$b, $a + $b];
    }
}

foreach (fib() as $n) {
    if ($n > 1000) break;
    var_dump($n);
}

もう1つは、Web上にあるさまざまPHP関連の情報です。たとえば、PHP Internals Book は、PHPのコア開発者が主に関わっており、内部アーキテクチャを知るうえで大変参考になります。

──なるほど。なにがどのように動いているのかを知ることが重要なのですね。それでは、もう少し俯瞰した質問で、プログラマとして必要な資質、考え方があれば教えてもらえますか。

廣川 あくまで私個人の考え方ですが、プログラマには2種類のタイプがいると思います。まず、目的を解決するために、エンジニアの役割としてプログラミングを行うタイプ。次に、プログラミングそのものに興味を持つ、プログラミングした結果に対し、そのプロセスや仕組みに興味を持つタイプです。

私は業務でPHPを使ってきたわけではなく、PHPに対しては後者の考え方で触れ続けてきました。PHPの仕組みへの興味を持ち、実際にコードを読みながら学んできました。ときにマニュアルが間違っていて先に進まないこともありましたが(笑)、興味のおもむくままに取り組んできたことで、より深い理解が得られたように思います。

どちらのタイプが良い、悪いということでは決してありません。、プログラミングに対して、まず仕組みを学ぶ意識、そして、興味を持って楽しめるかどうか、それはエンジニア・プログラマとしてとても重要な資質ではないでしょうか。

フレームワークをどのような視点で選ぶべきか

──次に、少し趣向を変えて、廣川さんが2020年の今、オススメできるPHPフレームワークがあれば教えてください。

廣川 先ほどの答えとつながるのですが、私はもともと、仕組みへの興味からPHPに触れてきました。ですから、いきなり質問を潰してしまうようですが、実はフレームワークがあまり好きではありません(笑)。フレームワークは、目的に対して効率化、汎用性を高めるツールであり、仕組みを学ぶためのものではなく、答えを最短距離で見つけるためのプロダクトだからです。

最近では多くのPHPフレームワークがあり、非常に便利になった反面、その中身はブラックボックスになりがちです。私はどうしても仕組みを知りたいので、中身が見えないと不安になってしまうんです。こうした観点から、私が一番触りたくなるのはマイクロフレームワークの「Slim」です。

Slimが備えるのは、必要最低限の機能であり、生成されるコードが少なく、ファイルサイズも小さいため、プログラムの動きを理解しやすい特徴があります。実際に開発を進めながら、デバッガを使えば、ソースコードの記述に対する動きも見やすいです。

──では、廣川さんの好みという観点ではなく、開発に便利なフレームワーク、という観点では、どのようなフレームワークをおすすめできるでしょうか。

廣川 実務や実際の開発で、いま選ぶとするならLaravelです。LaravelはCakePHPなどと同様にフルスタックフレームワークで、必要な機能がほぼ揃っており、手軽に高機能なWebアプリケーション開発ができます。

ただし、フルスタックなため、中身は複雑でブラックボックスになりやすい。ですから、動きを学ぶ、動きを知るという目的ではなく、開発者が意図するWebアプリ・Webサイト開発をするときに使いたいのがLaravelです。また、Laravelは、書籍やWeb上の情報、また、多くの方がイベントやセミナーで発表されているので、参考となるサンプルを探しやすいメリットがあります。

もっとも、Laravelがおすすめできるのは開発者、ユーザが豊富に存在する現時点でのことであり、将来的には他のフレームワークに代替される可能性もあります。Laravelにかぎった話ではありませんが、なんらかのフレームワークの開発が止まったり、プロジェクトが停止して使えなくなってしまった際、フルスタックフレームワークのように大規模なものだと、ユーザが独自にメンテナンスを続けるのは困難だからです。

これは、私がマイクロフレームワークを好むもう1つの理由でもあります。仮にそのフレームワークの開発が止まってしまっても、シンプルなマイクロフレームワークならば、長期的な開発・保守もしやすくなると考えています。

次期バージョン、PHP8はどうなる?

──PHPのこれからについてもお伺いします。次期バージョンであるPHP8の話も聞こえ始めてきましたが、近年のPHPの流れと、PHP 8におけるアップデート内容、展望を教えてください。

廣川 PHP 5.3 / 5.4である程度の成熟を見せましたが、PHP 7系になり、処理能力の面で大幅な改善が行われています。1つは、リクエスト処理数が大幅に大きくなったこと、そして、消費メモリが下がったことです。現時点(2020年3月の取材時)での最新バージョンとなる7.4では他に、アロー関数や配列スプレッド構文の導入が行われています。

そして、次のメジャーバージョンPHP 8では、JIT(Just In Time)コンパイラの導入が予定されています。JITを導入する言語が多数ある中で、いよいよPHPでも、という状況になってきましたんです。

──JITとはどのような機能なのでしょうか。

廣川 JITはプログラムの実行時に、あらかじめ中間コードをネイティブコードにコンパイルして保持し、それを使いまわすことでパフォーマンスを向上させる機能です。

大幅なパフォーマンス向上が期待できますが、すでにPHPの中間コードの実行効率は十分に最適化され速くなっており、ベンチマークコードを大幅に高速化することはできても、WordPressのように実用アプリケーションの中で大幅に高速化することは容易ではありません。

ですから、実用アプリケーションにおけるパフォーマンス向上の数字が50%を達成できるのであれば、バージョンアップする意味はありますが、数%〜10%程度であればバージョンアップの意義が薄れてしまいます。この点は今、開発陣がとくに注力して考えている部分です。

廣川さんがPHPカンファレンス2019で発表した資料『PHPの今とこれから2019』でもJITに関する言及がある。

──まさにチャレンジの途中、ということなのですね。

廣川 メジャーバージョンアップのため、目玉の機能が求められますし、JITはそれに十分値します・しかし、現時点では開発陣も課題を抱えていますし、昨今の新型コロナウィルスの騒動は、PHPの開発にも影響を与えています。

はっきりとしたことは言えませんが、どういう形でPHP 8がリリースされるかについては、継続して、GitHubの状況や開発陣から出される公式情報に注目してください。

──JIT以外にも注目すべきアップデートはありますか。

廣川 新機能であるUnionは注目すべきでしょう。PHP7ではタイプヒンティングで単一の型のみを指定できましたが、PHP8ではUnionとして複数の型を指定できるようになります。

<?php
class Test {
    private int|float $x;
    public function setVal(int|float $in) {
        $this->x = $in;
    }
    public function getVal() : int|float {
        return $this->x;
    }
}

$obj = new Test();
$obj->setVal(1.23);
echo $obj->getVal(); // 出力: 1.23

これからPHPプログラミングを始める方たちへ

──最後に、これからPHPプログラミングを始める方たちに向けて、スキルアップのためのアドバイスをお願いします。

廣川 勉強方法はさまざまですが、やはり本を読むことが大事です。まず、PHPがどういった言語であるかを知るために言語仕様を解説した書籍を、次に、実際の開発に向けては、サンプルが多数載っている解説書や、PHPを使ったシステム開発の解説書、とくに、セキュリティ手法やチューニング方法が掲載されているものを推薦します。

次に、繰り返しになりますが、ソースコードを読むこと。これが最もプログラミングスキルを上げるには適していると思います。たとえば、WordPressのソースコードや、WordPressを利用したシステム、あるいは、そのチューニング方法の情報を学ぶと、PHPを使った実践的なプログラミングを学べるはずです。セキュリティ関連ではやはり徳丸本をお勧めします。

そして、プログラミングをしていくうえでは「問題を解く」ことを楽しめるかどうかは、より良いプログラマに慣れるかどうか、大事な素養と思っています。PHPのプログラムは読みやすいので、問題発見がしやすい特徴があります。この問題発見のステップを楽しめれば、プログラマ、エンジニアとして楽しく成長していけると思います。

プログラマやエンジニアにとっては、課題や問題の解決は、存在意義があるとも言えます。それを楽しめるかは、1つの才能と言えるでしょう。これから、PHPプログラミングを始める方には、ぜひ「解決することを楽しむ気持ち」を伸ばしていってもらえたら嬉しいです。

──ありがとうございました。

廣川類さん取材の様子

関連記事

取材・文・構成:馮富久(株式会社技術評論社

*1:世界で初めてインターネット上で開催された万国博覧会