PHPには、http通信(curl)、SSL通信(OpenSSL)、画像処理(GD)、ソケット通信、XML(XMLWriter)など、外部リソースとやり取りする機能があります。
その中で上記の拡張機能はPHP8でクラスが追加されました。
リソース型変数に変わるクラスインスタンスに使われます。
リソースとは何か?
リソースは突き詰めればファイルのことです。英単語の意味は『資源・資産』。なんとなく分かりますね?
リソースにはインターネットなどの通信も含まれます。通信は結局、ファイルのやり取りなので。
プログラミングでの外部リソースは、初期化、コネクション(接続)、操作、開放の手順が必要で、そこで使われるのがディスクリプタ(識別子)。
たとえばファイル操作では、ファイルディスクリプタを取得しそれを使って、ファイルオープン、操作や編集、クローズを行います。
処理のクローズまで同じディスクリプタを使うことで同一セッションを保持し、複数のファイルを扱うことができます。まちがって別のファイルを触ることもありません。
ディスクリプタはcreate, open, initの名のついた関数で作られます。
C言語をやったことのある人はピンとくるんじゃないでしょうか?
同じディスクリプタを使った処理開始から終了までの一連をセッションと言います。
PHPではディスクリプタをリソース型という特殊な変数で使い、たんにリソースと呼ばれます。
また、PHPの拡張機能はパッケージで別途配布されることもあれば、本体に組み込まれることもあります。mb_stringとか。
(ソースコードを入手してインストールする方法もある。面倒だからあまりしないが。)
PHP公式ドキュメント
リソースの問題点
PHPでは以前から、リソース型という変数の使い勝手の悪さを気にしていたようです。
オブジェクト指向のガベージコレクションとの相性も悪く、XMLパーサではメモリリークも起きていたそう。
PHP8でのリソースまわりの修正はまずよく使われるリソースから手を付け、PHP8.1でも変更の予定があります。
これらのリソースの修正は、リソース型の変数からクラスインスタンスへの置き換えです。
cURL, http通信
Linuxなどのコマンドには、任意のサイトのHTMLを取得するのにcurlコマンドがあります。
これをPHPプログラムで行うのがcURL拡張機能です。
PHPにはcURLの処理を開始するのに使う初期化関数が3つ用意されているんですが、それぞれにクラスが追加され、リソース型から置き換わりました。
インスタンス の生成関数 | 関数の 戻り値 | リソース型 の名前 |
---|---|---|
curl_init() | CurlHandle | curl |
curl_multi_init() | CurlMultiHandle | curl_multi |
curl_share_init() | CurlShareHandle | curl_share |
変数の内容がリソース型からクラスインスタンスに変わっただけなので、PHP7以前のプログラムの修正は必要ありません。
(変数の型宣言やキャストをしてなければ。)
変数名は微妙になりますが。(リソースからハンドルに変わった。)
PHP公式ドキュメント
PHP Watch
ほかの外部リソースの処理でも同じ。プログラムの修正は必要ありません。
OpenSSL, SSL/TLS通信
OpenSSLは暗号化して通信を行う有名なオープンソースのソフトウェアでPHPでも拡張機能として提供されています。
SSLは Secure Sockets Layer で、TLSは Transport Layer Security でSSLを発展させたもの。
どちらも通信データを暗号化する技術の規格です。ウェブサイトなどhttp通信で使われるとhttpsになります。
PHP8では、証明書の読み込みの結果、署名のリクエストの結果、秘密/公開鍵の取得結果がリソース型変数からクラスインスタンスに代わりました。
インスタンス の生成関数 | 関数の 戻り値 | リソース型 の名前 |
---|---|---|
openssl_x509_read() | OpenSSLCertificate | OpenSSL X.509 |
openssl_csr_new() | OpenSSLCertificateSigningRequest | OpenSSL X.509 CSR |
openssl_get_privatekey() | OpenSSLAsymmetricKey | OpenSSL key |
openssl_get_publickey() | OpenSSLAsymmetricKey | OpenSSL key |
PHP公式ドキュメント
PHP Watch
Socket, ソケット通信
ソケット通信は、ローカルネットワーク内やインターネット上の端末間のデータ送受信の原始的な方法です。
PHP8では、ソケットディスクリプタ(ソケット識別子)がSocketクラスのインスタンスに変更されました。
また、アドレス情報もクラスのインスタンスに変更されてます。
インスタンス の生成関数 | 関数の 戻り値 | リソース型 の名前 |
---|---|---|
socket_create() | Socket | Socket |
socket_create_listen() | Socket | Socket |
socket_create_pair() | Socket の配列 | Socket |
socket_addrinfo_bind() | Socket | Socket |
socket_addrinfo_connect() | Socket | Socket |
socket_addrinfo_lookup() | AddressInfo の配列 | AddressInfo |
PHP公式ドキュメント
PHP Watch
PHP 8.0: Sockets extension resources (Socket and AddressInfo) are class objects
GD, 画像処理
GDは Graphics Draw のことで、画像処理の拡張機能です。PHP8から画像ID(リソース)はクラスのインスタンスに変更されました。
GDでの変更点はこれだけ。
インスタンス の生成関数 | 関数の 戻り値 | リソース型 の名前 |
---|---|---|
imagecreate() | GdImage | gd |
imagecreatefrombmp() | GdImage | gd |
imagecreatefromgd2() | GdImage | gd |
imagecreatefromgd2part() | GdImage | gd |
imagecreatefromgd() | GdImage | gd |
imagecreatefromgif() | GdImage | gd |
imagecreatefromjpeg() | GdImage | gd |
imagecreatefrompng() | GdImage | gd |
imagecreatefromstring() | GdImage | gd |
imagecreatefromwbmp() | GdImage | gd |
imagecreatefromwebp() | GdImage | gd |
imagecreatefromxbm() | GdImage | gd |
imagecreatefromxpm() | GdImage | gd |
imagecreatetruecolor() | GdImage | gd |
XMLパーサ, XMLWriter, XMLの操作
PHPにはXMLを操作する拡張機能がいくつもあります。PHP8ではその中の2つ、XMLパーサとXMLWriterに変更が加えられました。
XMLパーサでもリソース型に代わるクラスインスタンスが追加されました。
インスタンス の生成関数 | 関数の 戻り値 | リソース型 の名前 |
---|---|---|
xml_parser_create() | XmlParser | xml |
xml_parser_create_ns() | XmlParser | xml |
XMLWriterの変更点
XMLWriterはちょっとちがって、リソース型に代わるクラスは追加されていません。もともとあったXMLWriterクラスをリソースから置き換えてます。
XMLWriterはリソース型に代わるクラスとちがって各種メソッドが用意されていて、XMLWriter内のメソッドだけでxmlのセッションを一通りできます。
XMLWriterはPHP7以前から、リソースはXMLWriterインスタンスに隠蔽されて意識せずに操作できるようになっていました。
(リソースを分けたければインスタンスを別途作ればいい。インスタンス = 1リソース)
その思想を受け継いで、PHP8では一切リソースを意識させないようにしています。
手続き型関数は不要。クラスインスタンスで処理すべし。
XMLWriterには手続き型の関数が用意されていますが、これらが必要としていたパラメータのリソースはすべてXMLWriterクラスに置き換わりました。
これにより、手続き型関数はXMLWriterインスタンスで処理するのと一緒です。
正直、あえて手続き型で処理を書くメリットはありません。XMLWriterのインスタンスを作成し、この中で処理を完結させましょう。
PHP公式ドキュメント
PHP Watch