SHOEISHA iD

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

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

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

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

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

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

乱数発生の変更

 PHPにおける乱数発生の実装は、長らく問題とされてきました。例えば、以下のような問題です。

  • メルセンヌツイスタ(1996年に発表された疑似乱数発生器)がいまだに利用されている
  • 状態がグローバルな領域に保持されている(メルセンヌツイスタの利用に由来)
  • 奇数ばかりが出るなどランダム性が不完全である

 大きなものは、状態がグローバルな領域に保持されているということで、これにより外部ライブラリで乱数の発生が不安定になったりしていました。

 そこで、PHP 8.2ではRandom\Randomizerクラスが導入されました。このクラスのインスタンスでは、乱数発生エンジンを指定できるようにして、上記のような問題を解決しています。以下のリストは、乱数発生エンジンにRandom\Engine\Secureを使用した乱数発生の例です。

リスト randomize.php
$engine = new Random\Engine\Secure();
$randomizer = new Random\Randomizer($engine);

printf("%d\n", $randomizer->getInt(1, 10)); // mt_rand()の置き換え
printf("%s\n", bin2hex($randomizer->getBytes(10)));  // random_bytes()の置き換え
$ary = $randomizer->shuffleArray([1, 2, 3]); // shuffle()の置き換え
foreach ($ary as $a) {
    printf("%d ", $a);
}
printf("\n");
printf("%s\n", $randomizer->shuffleBytes('abc')); // str_shuffleの置き換え

 実行結果は下記です。乱数なので、実行するたびに結果は変化します。getBytesメソッドの戻り値はそのまま表示すると文字化けすることもあるので、bin2hex関数で16進表記に変換しています。

6
d29dd26d1448477882fa
1 2 3 
bac

 なお、shuffleBytesメソッドはPHP 8.2の策定当初はshuffleStringメソッドとして実装されていましたが、shuffleStringメソッドはマルチバイト文字列には対応していないので、動作を正確に表した名称に策定途中で変更されました。

関数の細かな変更

 関数単位でも、細かな変更が実施されました。

ロケール非依存の関数[8.2]

 strtolowerなどの文字種に関連する関数は、字種の判定をロケールに依存していました。strtolower関数はアルファベットを小文字に変換しますが、アルファベットであるか?という判定はロケールに依存していました。

 例えば、ウムラウトA(Ä)が変換されるかということはロケールに依存しており、ロケールによって挙動が変わるのは危険と見なされました。そこで以下の関数は、常にCロケールに基づく動作に変更され、具体的にはASCII文字に対してのみ作用します。ロケールによって挙動が変わらず、安全に利用できるようになりました。

  • strtolower、strtoupper
  • stristr、stripos、strripos
  • lcfirst、ucfirst、ucwords
  • str_ireplace

Cロケール

 CロケールとはPOSIXロケールとも呼ばれ、POSIXに準拠した環境のデフォルトロケールを意味します。ロケールとはある環境における国や言語に関連する一連の設定を指し、CロケールのCはC言語の規格で定められたロケールです。

utf8_decodeとutf8_encodeを削除[8.2]

 UTF-8文字列のデコードとエンコードのために、utf8_decode関数とutf8_encode関数があります。しかし、これらの関数の動作はLatin-1(ISO-8859-1)しか想定していません。他の処理系にもある似たような名称の関数と挙動が異なることで紛らわしいとして、PHP 8.2ではmb_convert_encoding関数の利用へ一本化することになりました。もともと、日本ではISO-8859-1のみを想定しているということは少ないので、影響は少ないと思われます。

iterator_*がiterable型の受け入れを可能に[8.2]

 iterator_to_array関数とiterator_count関数は、その名称にそぐわずにiterable型を受け入れることはできませんでした(Traversalインタフェースを実装した型のみ受け入れ可能)。PHP 8.2では、iterable型を受け入れ可能になり、array型もこれらの関数に渡すことができます(iteratable型はarray型とTraversable型のUNION型であるため)。

次のページ
その他の変更

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング