部分的なサポートのcallableの構文削除
部分的なサポートのcallableとは、is_callable関数でtrueが返り、call_user_func関数で呼び出すことができても、$callable()のように直接呼び出せないcallableのことをいいます。このようなcallableの書式が、PHP 8.2では削除されました。この理解のために、まずはcallableについて紹介しておきます。
callableとは
callableとは、一言でいうと関数を表す型です。call_user_func関数やusort関数などはcallable型の引数で関数を受け取って、内部からその関数を呼び出します(コールバック関数)。以下のリストは、典型的なコールバック関数の例です。callable_funcがcallableであり、is_callable関数によるcallableであるかの判定や、call_user_func関数によるコールバック、単独での呼び出しに使用されています。
function func() { printf("Callable function.\n"); } $callable_func = "func"; printf("is_callable = %d\n", is_callable($callable_func)); printf("call_user_func = %d\n", call_user_func($callable_func)); $callable_func();
実行結果は下記です。
is_callable = 1 Callable function. call_user_func = 0 Callable function.
このように、callableを使うと関数名を文字列として保持し、必要に応じて関数を別の関数の引数にしたり、単独で呼び出すことができます。このとき、callableは単純な関数名のほかに、以下のようにクラスの静的なメソッド、インスタンスのメソッドも指定できます。インスタンスのメソッドの場合、callableは配列になります。
class ClassA { public static function funcA() { } public function funcB() { } } $callable_func = "ClassA::funcA"; // クラスの静的なメソッド $obj = new ClassA(); $callable_func = array($obj, "funcB"); // インスタンスのメソッド $callable_func = array("ClassA", "funcA"); // クラスの静的なメソッド
矛盾するcallable構文の削除[8.2]
これらのcallable構文のうち、is_callable関数ではtrueが返ってきて、call_user_func関数でも呼び出せるのに、単独では呼び出すことができない構文がいくつか存在しました。PHP 8.2では、これらの構文がE_DEPRECATEとなり、将来のバージョン(9.0)で削除されることになっています。以下は、削除されたcallableの書式と、代替の書式の例です。
"self::method" ⇒self::class . "::method" "parent::method" ⇒parent::class . "::method" "static::method" ⇒static::class . "::method" ["self", "method"] ⇒[self::class, "method"] ["parent", "method"] ⇒[parent::class, "method"] ["static", "method"] ⇒[static::class, "method"] ["Foo", "Bar::method"] [new Foo, "Bar::method"]
最後の2つを除けば、コンテキストで意味が変わってくるcallableとなります。代替書式の方は、呼び出し時のコンテキストを反映したcallableとすることができます。
データベースサポートの変更
データベースであるMySQLのサポートについて、いくつかの変更がありました。
MySQLiにexecute_queryメソッドを追加[8.2]
MySQLiとは、PHPでMySQLを利用するための拡張モジュールの一つです。このモジュールによって、mysqliクラスの用意するMySQL操作のためのプロパティ、メソッドが利用可能になります。このMySQLiでデータベースに選択クエリを発行するには、以下のリストのように3つのメソッドで行うのが普通でした。
$stmt = $db->prepare('SELECT * FROM user WHERE name LIKE ?'); $stmt->bind_param('s', $name); $stmt->execute();
PHP 8.2では、クエリ実行のための新しいメソッドexecute_queryが追加されました。このexecute_queryメソッドによって、上記のコードは以下のリストのように簡略化できます。
$db->execute_query('SELECT * FROM user WHERE name LIKE ?', [$name]);
結果は、executeメソッドと同様にレコードのセットが返されます。クエリ文の用意、クエリパラメータのセット、クエリの実行を一つの文で実行できるので非常に便利です。
MySQLiにおけるPHP 8.1における変更
MySQLiにおいては、PHP 8.1でもいくつかの変更が実施されました。
- mysqliのエラーモードのデフォルトデフォルトが例外になった
- mysqli_result::fetch_columnメソッドがサポートされた
- mysqli::executeの実行時の引数渡しに対応した
MySQLモジュールのためのライブラリlibmysqlを削除[8.2]
上記のMySQLiをはじめとして、PHPでMySQLを扱えるようにするモジュールにはいくつかの種類があります。いずれも、mysqlnd(MySQL Native Driver)とlibmysqlという2つのライブラリのいずれかをベースとしてきました。
PHP 8.2では、このうちlibmysqlが削除され、mysqlndへ一本化されました。libmysqlがMySQL本体のインストールを必要としたり、ライセンスの関係でPHPに同梱できないのに対して、mysqlndはPHPに同梱されていてデフォルトで利用可能であり、クエリのキャッシュや遅延接続などlibmysqlにない機能も備えているので、今後はmysqlndのみを使おうという変更になっています。