新機能
- 読み取り専用クラス‥‥すべてのプロパティがreadonlyとなり、動的なプロパティを作成できなくなる。
- DNF(Disjunctive Normal Form)型‥‥union 型 と 交差型 を組み合わせることができる。
- null, false, true が独立した型に
- "Random" 拡張モジュール‥‥既存の乱数ジェネレーターの問題を解決した。
- トレイトで定数‥‥トレイトを使うクラスを通じて定数にアクセスできるようになった。
非推奨
- 動的なプロパティ
- ${} 形式の、文字列への値の埋め込み
- utf8_encode と utf8_decode
- 内部メソッド SplFileInfo::_bad_state_ex
パスワードを生成するプログラム
サンプル・プログラムのダウンロード
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: ?>
パスワードの長さの最小値は LENGTH_MIN、最大値は LENGTH_MAX に、生成したいパスワードの長さを LENGTH にそれぞれ代入しておき、ユーザー関数 getPassword の中でベリフィケーションするようにした。
パスワードに使える文字は CHARACTERS に代入しておき(英小文字と記号を追加した)、印字可能な半角文字かどうかをユーザー関数 getPassword の中でベリフィケーションするようにした。
乱数は Random\Randomizer クラスに変更した。
これにともない、PHPのバージョンが8.2以上かどうかをユーザー関数 isPHPversion を使ってベリフィケーションするようにした。
これらのベリフィケーションでエラーとなった場合はユーザーエラーを発生させ、例外処理するようにした。
パスワードを表示する処理では、記号として < や > を追加したことから、 htmlspecialchars を使ってエスケープするようにした。
参考サイト
- PHP 8:Windows版のイントール/Apacheと連携/特長
- PHP: PHP 8.1.x から PHP 8.2.x への移行:PHPマニュアル
- PHPでパスワードを生成:ぱふぅ家のホームページ