PHP 8.2 で変わったこと

PHP 8.2
PHP 8.2は、2022年(令和4年)12月8日に正式版がリリースされた。読み取り専用クラス、独立した型 null, false, true、動的なプロパティの非推奨化や、パフォーマンスの向上などが実施された。

目次

新機能

  • 読み取り専用クラス‥‥すべてのプロパティがreadonlyとなり、動的なプロパティを作成できなくなる。
  • DNF(Disjunctive Normal Form)型‥‥union 型 と 交差型 を組み合わせることができる。
  • null, false, true が独立した型に
  • "Random" 拡張モジュール‥‥既存の乱数ジェネレーターの問題を解決した。
  • トレイトで定数‥‥トレイトを使うクラスを通じて定数にアクセスできるようになった。

非推奨

  • 動的なプロパティ
  • ${} 形式の、文字列への値の埋め込み
  • utf8_encode と utf8_decode
  • 内部メソッド SplFileInfo::_bad_state_ex

パスワードを生成するプログラム

乱数ジェネレーター問題が解決されたことから、「PHPでパスワードを生成」で紹介したプログラムを移植してみることにする。

サンプル・プログラムのダウンロード

圧縮ファイルの内容
password82.phpサンプル・プログラム本体。
password82.php 更新履歴
バージョン 更新日 内容
1.0.0 2023/01/08 初版

サンプル・プログラムの解説

   1: <?php
   2: /** password82.php
   3:  * パスワードを生成するPHPプログラム
   4:  *
   5:  * @copyright   (c)studio pahoo
   6:  * @author      パパぱふぅ
   7:  * @動作環境    PHP 8.2 以上
   8:  * @参考URL     https://www.pahoo.org/e-soul/webtech/php01/php41-01.shtm
   9: */
  10: declare(strict_types=1);        //厳密な型付け
  11: 
  12: //定数 ======================================================================
  13: define('LENGTH_MIN',    4);         //パスワード最小長
  14: define('LENGTH_MAX',    19);        //パスワード最大長
  15: 
  16: //パスワード長
  17: define('LENGTH',        10);
  18: //パスワードに使える文字
  19: define('CHARACTERS',    '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%&()*+-=@<>');
  20: 
  21: /**
  22:  * PHPのバージョンを評価する。
  23:  * PHPのバージョンが $major.$minor 以上ならTRUEを、そうでなければFALSEを返す。
  24: */
  25: function isPHPversion(int $major, int $minor): bool {
  26:     $number = $major * 10000 + $minor * 100;
  27:     $version = explode('.', phpversion());
  28:     $version = (int)$version[0* 10000 + (int)$version[1* 100;
  29: 
  30:     return $version >$number ? TRUE : FALSE;
  31: }
  32: 
  33: /**
  34:  * パスワードを生成する。
  35:  * 文字列 $characters の中からランダムに抽出した文字を使い、
  36:  * 長さ $length のパスワードを返す。
  37:  * 乱数ジェネレーター問題を解決したPHP8.2以上であること、
  38:  * および引数のベリフィケーションを行い、
  39:  * 不合格となった場合にはユーザーエラーを発生する。
  40: */
  41: function getPassword82(int $length, string $characters): ?string {
  42:     //PHPバージョンが古ければ、エラーを発生する。
  43:     if (! isPHPversion(8, 2)) {
  44:         trigger_error('PHP version is too old.', E_USER_ERROR);
  45:         return NULL;
  46:     }
  47: 
  48:     //$charactersのベリフィケーション
  49:     if (! ctype_print($characters)) {
  50:         trigger_error('Password contains characters that cannot be used.', E_USER_ERROR);
  51:         return NULL;
  52:     }
  53: 
  54:     //$lengthのベリフィケーション
  55:     if ($length < LENGTH_MIN) {
  56:         trigger_error('Password length is too short.', E_USER_ERROR);
  57:         return NULL;
  58:     } else if ($length > LENGTH_MAX) {
  59:         trigger_error('Password length is too long.', E_USER_ERROR);
  60:         return NULL;
  61:     }
  62: 
  63:     //RandomEngineを利用する。
  64:     $random = new Random\Randomizer();
  65: 
  66:     //$charactersからランダムに1文字ずつ選んで$passwordに結合していく。
  67:     $password = '';
  68:     for ($i = 0$i < $length$i++) {
  69:         $position = (int)$random->getInt(0, strlen($characters- 1);
  70:         $password = $password . substr($characters, $position, 1);  //1文字追加
  71:     }
  72:     return $password;
  73: }
  74: 
  75: //メイン・プログラム ========================================================
  76: 
  77: //生成したパスワードを画面表示する。
  78: try {
  79:     print htmlspecialchars(getPassword82(LENGTH, CHARACTERS));
  80: 
  81: //エラー・メッセージを表示する。
  82: catch (Exception $ex) {
  83:     print $ex->getMessage();
  84: }
  85: 
  86: /*
  87: ** バージョンアップ履歴 ===================================================
  88:  *
  89:  * @version  1.0.0  2023/01/08  初版
  90: */
  91: ?>

関数や引数の型付けを厳密にした。また、 declare を使って型チェックを厳しくした。

パスワードの長さの最小値は LENGTH_MIN、最大値は LENGTH_MAX に、生成したいパスワードの長さを LENGTH にそれぞれ代入しておき、ユーザー関数 getPassword の中でベリフィケーションするようにした。
パスワードに使える文字は CHARACTERS に代入しておき(英小文字と記号を追加した)、印字可能な半角文字かどうかをユーザー関数 getPassword の中でベリフィケーションするようにした。

乱数は Random\Randomizer クラスに変更した。
これにともない、PHPのバージョンが8.2以上かどうかをユーザー関数 isPHPversion を使ってベリフィケーションするようにした。

これらのベリフィケーションでエラーとなった場合はユーザーエラーを発生させ、例外処理するようにした。

パスワードを表示する処理では、記号として <> を追加したことから、 htmlspecialchars  を使ってエスケープするようにした。

参考サイト

(この項おわり)
header