10月2日(土)、3日(日)、PHPカンファレンス2021が開催されました。 PHPカンファレンスは今年で21回目の開催となり、昨年に引き続きのオンライン開催となりました。また、今年は特別に2日間の開催となりました。本記事ではその模様をお伝えしていきます。前編では初日(10月2日)の3セッションを取り上げます。
なお、カンファレンスの録画がYouTube上にあります。あわせて参照してください。
廣川類さん「PHPの今とこれから2021」
オープニングセッションとして毎年恒例となっている、日本PHPユーザー会の廣川類さんがPHPの今とこれからについて話しました(発表スライドはこちら)。
これまでのPHPの歩み
PHPは1995年に誕生以来、Webと共に成長と発展を続けてきました。 特にWebの世界では技術革新が速く、その26年という年月に渡り使われ続けてきた実績がPHPにはあります。
PHPはサーバーサイド言語シェアで、78.7%というデファクトスタンダードと言っても過言ではないほどの高いシェアを確保しています。CMSシェアにおいてもWordPressが65.2%と高いシェアを獲得しています。
また、PHP自体の高速化についても日々向上しており、20年前と比較して速度がおよそ50倍まで高速化されました。この高速化の素晴らしい点は、ソースコードをほとんど修正することなくPHPのバージョンアップを行うことにより恩恵を受けられることです。
高速化については各バージョンでそれぞれ改善しており、特にここ10年で3つの大きな高速化の革新がありました。
- PHP 5.3~5.4:現代的な機能の導入
- PHP 7:大幅高速化
- PHP 8:JIT導入
高速化を行いながらも、PHPが大規模Web開発に使いやすくなるようなモダンな機能や構文がどんどん追加されていて、一昔前のPHPとは違うスマートな構文での開発が可能となっています。
今年はPHP8系初のマイナーバージョンアップデートのPHP 8.1が11月25日にリリース予定となっています。 なお、PHP 7.2以前はすでにサポートが切れていて、PHP 7.3も12月6日にサポート切れとなります。
これからのPHP 8.1の特徴と新機能
先程も少し触れましたが、PHP8系の初めてのマイナーバージョンアップのPHP 8.1も、よりモダンで高速化しています。
まず、PHP 8.0で導入されたJITがさらに高速化されています。 ただし、PHP7系時点でも十分に高速化されていたため、気づきにくいかもしれませんが、スライドのグラフの通り確実に高速化されていると説明がありました。
つづいて、PHP 8.1の新機能について取り上げました。 今回もたくさんの改善/変更ポイントがリリースされる予定です。
PHP 8.1の大きな目玉として、Fiberを使った非同期処理が実装されました。 これは以前より待ち望まれていた機能です。いくつかのフレームワークでは非同期処理が実装されています。実際に利用する場合は、フレームワーク側から利用することが多くなると思います。
もう一つの目玉として、enumを使った列挙型が実装されました。 これも以前より待ち望まれていた機能で、他言語で便利に利用していた開発者に恩恵のある構文かと思います。
ほかにもたくさんの構文や機能が実装されており多岐にわたります。発表スライドやドキュメントを参照してください。
おわりに
最後に廣川さんは「PHPユーザー会では、PHPの勉強会やカンファレンスに参加して相互の情報交換とコミュニティの健全な発展を目的に活動しております。本日のPHPカンファレンスも是非お楽しみください」と述べ、PHPカンファレンス参加者の活発な交流を呼びかけ締めくくりました。
成瀬允宣さん「PHPで学ぶオブジェクト指向プログラミング入門」
PHPカンファレンスでは初学者向けのセッションもあり、成瀬允宣さんがオブジェクト指向プログラミングへのステップアップについて話しました(発表スライドはこちら)。
オブジェクト指向はなぜ必要か?
オブジェクトが必要な理由について考えるにあたって、コンピュータのプログラムの歴史を振り返りました。
プログラムは機械語からアセンブリ言語、高級言語の中の手続き型言語と発展していきました。 この発展を振り返ってみると「抽象化」されていることがわかります。
手続き型言語の書き方も随分と抽象化されています。コンピュータは2進数で動きます。「3」という数字をコンピュータに認識させるためには、2進数で「11」と記載しレジスタやメモリを制御する必要があるはずですが、プログラミング中に2進数で書くことはほぼありません。これは数字を抽象化して書いてあると捉えられます。変数も数字や文字列を抽象化していますし、関数もコードを抽象化して再利用性を高めています。
ここまでの実装では実用に足りないことがプログラミングで起こってきました。その一つの解決方法としてオブジェクト指向が必要になってきます。
ここからは、じゃんけんを例に実際にコードの実装を交えて手続き型プログラミングをオブジェクト指向プログラミングに書き換えながら、解説していきました。
オブジェクト指向プログラミング
オブジェクト指向プログラミングでは、クラスの設計が重要になってきます。クラスは今までの手続き型プログラミングとは違い、上から順番にコードを読んでいきコードを実行するものではありません。
クラスとは整合性の範囲を示すものです。クラスの範囲内でコードを修正した場合は、クラス内の他のコードに影響がないか調べればよいという範囲を示すものです。
まずは手続き型で作成していたコードを関連する範囲内で、整合性を保ちたい範囲をクラスで囲います。作成したクラスはインスタンス化します。これはクラスを設計図としてオブジェクトを作成しメモリを確保するということです。
オブジェクト指向プログラミングではクラス内の関数のことをメソッドと呼び、アロー関数でインスタンス化した変数から呼び出すことができます。
クラス内部で整合性が保たれるように変更し、外部から使用されている部分に影響を与えないカプセル化、クラスが外側から使われるルールを示すインターフェースなど、オブジェクト指向プログラミングがいろいろな問題を解決できる様子を丁寧にステップごとに解説しました。
まとめ
最後に成瀬さんは「お話した内容はオブジェクト指向プログラミングの入り口ですが、オブジェクト指向プログラミングのイメージは掴んでいただけたと思います」と述べ、オブジェクト指向プログラミングに苦手意識を持たなくても大丈夫と締めくくりました。イベント当日の感想を聞いた複数の初学者が、このセッションが一番印象に残ったと言われるくらい人気のあるセッションでした。
頓花さん「レガシーシステムにおけるPHP8バージョンアップのアプリ対応記録」
昨年リリースされたPHP 8.0への対応検討をしているエンジニアは多くいるかと思います。頓花さんがPHP 8.0へのバージョンアップの対応記録をもとに話しました(発表スライドはこちら)。
緩やかな比較演算子の挙動変更
PHP 8.0で大きな変更点の一つに緩やかな比較演算子(==
、!=
など)の挙動が変更になっています。これは比較対象の型が違っていても同じとして判定してくれるものです。 この判定基準の一部が変わってしまったため、できうる限り厳密な比較演算子を使用したほうがよいため、今からコーディングする際には型も意識したほうがよいでしょう。
警告レベルの挙動変更
PHP 8.0からはエラーがより厳しいものになっているものが多数存在します。NoticeだったものがWarningに、WarningだったものがErrorになっています。
例として未定義変数の読み取りエラーは、PHP 7系まではNoticeだった警告もPHP 8.0ではWarningに変更されています。
バージョンアップする前に、NoticeやWarningがエラーログに出力されていないか確認し、修正しておいたほうが良いとのことでした。
対応の方針
緩やかな演算子の挙動変更確認では、アプリ全体の約47万行中約2.7万行が対象として見つかったため、対象を絞りチェック関数を用意し検証したとのことです。
警告レベルの挙動変更確認では、引数の型や戻り値の型が宣言されていないため静的コード解析ができないため、こちらも対象を絞り通過テストを行ったとのことです。
両方の挙動変更確認に言えることは、どちらも型宣言が重要になっているということが根底にあるのではないかと思います。
まとめ
最後に頓花さんは「一言でいうと、影響範囲が広い。範囲を絞りながら対応することが大事」と述べ、バージョンアップに向けて検討しているエンジニアへ知見を共有しました。PHPも静的型付けが重要になってくるという意見が印象的でした。