SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ますます便利になるPHPの新機能を探ろう!

より使いやすくなったPHP 8.2の新機能──関数の改良やデータベースサポートの変更を中心に紹介

ますます便利になるPHPの新機能を探ろう! 第2回

  • X ポスト
  • このエントリーをはてなブックマークに追加

部分的なサポートの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関数によるコールバック、単独での呼び出しに使用されています。

リスト callable.php
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は配列になります。

リスト callable.php
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つのメソッドで行うのが普通でした。

リスト mysql.php
$stmt = $db->prepare('SELECT * FROM user WHERE name LIKE ?');
$stmt->bind_param('s', $name);
$stmt->execute();

 PHP 8.2では、クエリ実行のための新しいメソッドexecute_queryが追加されました。このexecute_queryメソッドによって、上記のコードは以下のリストのように簡略化できます。

mysql.php
$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のみを使おうという変更になっています。

次のページ
乱数発生の変更

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ますます便利になるPHPの新機能を探ろう!連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook <個人紹介> WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/17485 2023/03/29 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング