ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHP8, 外部リソースを操る拡張機能のコアをリソース型変数からクラスオブジェクトへ移行

php
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

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()CurlHandlecurl
curl_multi_init()CurlMultiHandlecurl_multi
curl_share_init()CurlShareHandlecurl_share
リソース型のクラスインスタンス

変数の内容がリソース型からクラスインスタンスに変わっただけなので、PHP7以前のプログラムの修正は必要ありません。

(変数の型宣言やキャストをしてなければ。)

変数名は微妙になりますが。(リソースからハンドルに変わった。)

ほかの外部リソースの処理でも同じ。プログラムの修正は必要ありません。

OpenSSL, SSL/TLS通信

OpenSSLは暗号化して通信を行う有名なオープンソースのソフトウェアでPHPでも拡張機能として提供されています。

SSLは Secure Sockets Layer で、TLSは Transport Layer Security でSSLを発展させたもの。

どちらも通信データを暗号化する技術の規格です。ウェブサイトなどhttp通信で使われるとhttpsになります。

PHP8では、証明書の読み込みの結果、署名のリクエストの結果、秘密/公開鍵の取得結果がリソース型変数からクラスインスタンスに代わりました。

インスタンス
の生成関数
関数の
戻り値
リソース型
の名前
openssl_x509_read()OpenSSLCertificateOpenSSL X.509
openssl_csr_new()OpenSSLCertificateSigningRequestOpenSSL X.509 CSR
openssl_get_privatekey()OpenSSLAsymmetricKeyOpenSSL key
openssl_get_publickey()OpenSSLAsymmetricKeyOpenSSL key
リソース型のクラスインスタンス

Socket, ソケット通信

ソケット通信は、ローカルネットワーク内やインターネット上の端末間のデータ送受信の原始的な方法です。

PHP8では、ソケットディスクリプタ(ソケット識別子)がSocketクラスのインスタンスに変更されました。

また、アドレス情報もクラスのインスタンスに変更されてます。

インスタンス
の生成関数
関数の
戻り値
リソース型
の名前
socket_create()SocketSocket
socket_create_listen()SocketSocket
socket_create_pair()Socket
の配列
Socket
socket_addrinfo_bind()SocketSocket
socket_addrinfo_connect()SocketSocket
socket_addrinfo_lookup()AddressInfo
の配列
AddressInfo
リソース型のクラスインスタンス

GD, 画像処理

GDは Graphics Draw のことで、画像処理の拡張機能です。PHP8から画像ID(リソース)はクラスのインスタンスに変更されました。

GDでの変更点はこれだけ。

インスタンス
の生成関数
関数の
戻り値
リソース型
の名前
imagecreate()GdImagegd
imagecreatefrombmp()GdImagegd
imagecreatefromgd2()GdImagegd
imagecreatefromgd2part()GdImagegd
imagecreatefromgd()GdImagegd
imagecreatefromgif()GdImagegd
imagecreatefromjpeg()GdImagegd
imagecreatefrompng()GdImagegd
imagecreatefromstring()GdImagegd
imagecreatefromwbmp()GdImagegd
imagecreatefromwebp()GdImagegd
imagecreatefromxbm()GdImagegd
imagecreatefromxpm()GdImagegd
imagecreatetruecolor()GdImagegd
リソース型のクラスインスタンス

XMLパーサ, XMLWriter, XMLの操作

PHPにはXMLを操作する拡張機能がいくつもあります。PHP8ではその中の2つ、XMLパーサとXMLWriterに変更が加えられました。

XMLパーサでもリソース型に代わるクラスインスタンスが追加されました。

インスタンス
の生成関数
関数の
戻り値
リソース型
の名前
xml_parser_create()XmlParserxml
xml_parser_create_ns()XmlParserxml
リソース型のクラスインスタンス

XMLWriterの変更点

XMLWriterはちょっとちがって、リソース型に代わるクラスは追加されていません。もともとあったXMLWriterクラスをリソースから置き換えてます。

XMLWriterはリソース型に代わるクラスとちがって各種メソッドが用意されていて、XMLWriter内のメソッドだけでxmlのセッションを一通りできます。

XMLWriterはPHP7以前から、リソースはXMLWriterインスタンスに隠蔽されて意識せずに操作できるようになっていました。

(リソースを分けたければインスタンスを別途作ればいい。インスタンス = 1リソース)

その思想を受け継いで、PHP8では一切リソースを意識させないようにしています。

手続き型関数は不要。クラスインスタンスで処理すべし。

XMLWriterには手続き型の関数が用意されていますが、これらが必要としていたパラメータのリソースはすべてXMLWriterクラスに置き換わりました。

これにより、手続き型関数はXMLWriterインスタンスで処理するのと一緒です。

正直、あえて手続き型で処理を書くメリットはありません。XMLWriterのインスタンスを作成し、この中で処理を完結させましょう。

前の投稿
PHP8, create_function()の廃止。無名関数を使おう!
PHP8, パラメータやリターン値が変わる関数。リターン値の判定は注意が必要。
次の投稿
コメントを残す

*