【PHP8.x】Random\Randomizer::__construct()メソッドの使い方
__constructメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
__constructメソッドは、Random\Randomizerクラスの新しいインスタンスを初期化するメソッドです。Random\Randomizerクラスは、PHP 8.2で導入された、安全かつ柔軟な乱数生成機能を提供するクラスです。このコンストラクタを使用することで、開発者はRandomizerオブジェクトがどのようなアルゴリズムで乱数を生成するかを制御できます。
このメソッドは、オプションでRandom\Engineインターフェースを実装するオブジェクトを引数として受け取ります。このengine引数には、乱数を実際に生成するアルゴリズムを提供するオブジェクト(乱数生成エンジン)を指定します。例えば、特定の擬似乱数生成アルゴリズムを使用したい場合や、より強力な暗号論的に安全な乱数が必要な場合など、アプリケーションの要件に応じて異なるエンジンを選択できます。
もし、このengine引数が省略された場合、Random\RandomizerクラスはデフォルトでRandom\Engine\Secureというエンジンを内部的に使用します。Random\Engine\Secureは、オペレーティングシステムの提供する高品質なエントロピー源を利用し、暗号論的に安全な乱数を生成するため、セキュリティが特に重要な場面で推奨されます。
したがって、この__constructメソッドは、Randomizerオブジェクトの振る舞いを定義し、信頼性や安全性の高い乱数をプログラムで利用するための最初のステップとなります。これにより、ゲームの要素、セキュリティトークンの生成、データシャッフルなど、様々な用途で適切な乱数を利用することが可能になります。
構文(syntax)
1public Random\Randomizer::__construct(Random\Engine $engine = null)
引数(parameters)
?Random\Engine $engine = null
- ?Random\Engine $engine = null: 使用する乱数生成エンジン。指定しない場合はデフォルトのエンジンが使用されます。
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP 8.0 コンストラクタプロパティプロモーション入門
1<?php 2 3// このコードは PHP 8.2 以降で動作します。 4 5/** 6 * CustomRandomizer クラスは、PHP 8.2で導入された Random\Randomizer クラスをラップし、 7 * PHP 8.0で導入されたコンストラクタプロパティプロモーションの使用例を示します。 8 */ 9class CustomRandomizer 10{ 11 // Random\Randomizer のインスタンスを保持するプロパティ 12 private Random\Randomizer $randomizer; 13 14 /** 15 * コンストラクタ 16 * 17 * @param ?Random\Engine $engine 乱数生成に使用するエンジン (オプション)。 18 * この引数は、PHP 8.0で導入された「コンストラクタプロパティプロモーション」により、 19 * クラスのプライベートプロパティ ($this->engine) として自動的に宣言・初期化されます。 20 * null を指定した場合、Random\Randomizer はデフォルトのエンジンを使用します。 21 */ 22 public function __construct( 23 private ?Random\Engine $engine = null 24 ) { 25 // Random\Randomizer クラスのインスタンスを初期化します。 26 // ここで、コンストラクタプロパティプロモーションによって作成された $this->engine プロパティが渡されます。 27 // Random\Randomizer::__construct メソッドは、引数として Random\Engine オブジェクト、または null を受け取ります。 28 $this->randomizer = new Random\Randomizer($this->engine); 29 } 30 31 /** 32 * 指定された範囲の整数乱数を生成します。 33 * 34 * @param int $min 最小値 (含む) 35 * @param int $max 最大値 (含む) 36 * @return int 生成された乱数 37 */ 38 public function generateInteger(int $min, int $max): int 39 { 40 return $this->randomizer->getInt($min, $max); 41 } 42 43 /** 44 * 現在設定されている乱数エンジンのクラス名を取得します。(デモンストレーション用) 45 * 46 * @return string 47 */ 48 public function getEngineClassName(): string 49 { 50 // コンストラクタでエンジンが明示的に指定された場合、そのクラス名を返します。 51 // 指定されなかった場合(nullが渡された場合)、Random\Randomizer が内部的に使用する 52 // デフォルトのエンジンであることを示します。 53 return $this->engine ? get_class($this->engine) : 'Default (internal) engine used by Random\Randomizer'; 54 } 55} 56 57// --- CustomRandomizer の使用例 --- 58 59echo "--- CustomRandomizer の使用例 ---\n\n"; 60 61// 1. エンジンを指定せずに CustomRandomizer を初期化 62// Random\Randomizer は内部でデフォルトのエンジン(例: Random\Mt19937)を使用します。 63echo "1. エンジンを明示的に指定しない場合:\n"; 64$defaultRandomizer = new CustomRandomizer(); 65echo " 使用されるエンジン: " . $defaultRandomizer->getEngineClassName() . "\n"; 66echo " 乱数 (1-100): " . $defaultRandomizer->generateInteger(1, 100) . "\n"; 67echo " 乱数 (1-100): " . $defaultRandomizer->generateInteger(1, 100) . "\n\n"; 68 69// 2. Random\Mt19937 エンジンを指定して CustomRandomizer を初期化 70echo "2. Mt19937 エンジンを指定する場合:\n"; 71$mtEngine = new Random\Mt19937(); // Random\Engine インターフェースを実装するクラス 72$mtRandomizer = new CustomRandomizer($mtEngine); 73echo " 使用されるエンジン: " . $mtRandomizer->getEngineClassName() . "\n"; 74echo " 乱数 (1-100): " . $mtRandomizer->generateInteger(1, 100) . "\n"; 75echo " 乱数 (1-100): " . $mtRandomizer->generateInteger(1, 100) . "\n\n"; 76 77// 3. Random\LcgRandomizer エンジンを指定して CustomRandomizer を初期化 78echo "3. LcgRandomizer エンジンを指定する場合:\n"; 79$lcgEngine = new Random\LcgRandomizer(); // Random\Engine インターフェースを実装する別のクラス 80$lcgRandomizer = new CustomRandomizer($lcgEngine); 81echo " 使用されるエンジン: " . $lcgRandomizer->getEngineClassName() . "\n"; 82echo " 乱数 (1-100): " . $lcgRandomizer->generateInteger(1, 100) . "\n"; 83echo " 乱数 (1-100): " . $lcgRandomizer->generateInteger(1, 100) . "\n";
PHPのRandom\Randomizerクラスは、安全で予測困難な乱数を生成するための機能を提供します。このクラスの__constructメソッドは、新しいRandom\Randomizerオブジェクトを初期化する際に呼び出される特別なメソッドです。
引数$engineはオプションで、Random\Engineインターフェースを実装した乱数生成エンジンオブジェクトを指定できます。この引数を省略するかnullを指定した場合、Random\Randomizerは内部的にデフォルトのエンジンを使用します。このコンストラクタはオブジェクトの初期化を行うため、特定の戻り値はありません。
サンプルコードでは、CustomRandomizerクラスのコンストラクタで、PHP 8.0で導入された「コンストラクタプロパティプロモーション」という機能が使用されています。これは、コンストラクタの引数にprivateなどのアクセス修飾子を付けることで、その引数が自動的にクラスのプロパティとして宣言され、初期化される便利な構文です。CustomRandomizerは、このプロモーションされた$this->engineプロパティを使い、内部で初期化するRandom\Randomizerインスタンスへ乱数生成エンジンを渡しています。これにより、外部から任意のエンジンを指定したり、デフォルトのエンジンを使用したりして、柔軟に安全な乱数を生成できる仕組みを実現しています。
このサンプルコードは、PHP 8.2で導入された安全な乱数生成クラスRandom\Randomizerと、PHP 8.0で追加されたコンストラクタプロパティプロモーションの活用例です。Random\Randomizerの__constructメソッドは、オプションでRandom\Engine型の引数を受け取ります。この引数を渡すことで、使用する乱数生成アルゴリズムを選択可能です。引数を省略した場合は、Random\Randomizerが内部でデフォルトのエンジンを使用します。コンストラクタプロパティプロモーションは、引数をクラスプロパティとして簡潔に宣言・初期化できるPHP 8.0以降の便利な記法です。コードの実行にはPHP 8.2以降が必要です。
PHP8.0 コンストラクタプロパティで乱数生成する
1<?php 2 3// PHP 8.2以降でRandom\Randomizerクラスが利用可能です。 4// プロパティプロモーションはPHP 8.0で導入されました。 5 6/** 7 * カスタム乱数ジェネレータクラス。 8 * Random\Randomizerを利用し、コンストラクタプロパティプロモーションの例を示します。 9 */ 10class MyRandomGenerator 11{ 12 /** 13 * Random\Randomizer のインスタンス。 14 * 乱数生成の実際の処理を担います。 15 */ 16 private Random\Randomizer $randomizer; 17 18 /** 19 * MyRandomGenerator のコンストラクタ。 20 * 21 * 引数 $engine は、PHPのコンストラクタプロパティプロモーション機能を使用して、 22 * 直接プライベートプロパティ $this->engine として定義・初期化されます。 23 * これにより、冗長なプロパティ宣言と初期化のコードを削減できます。 24 * 25 * @param ?Random\Engine $engine 使用する乱数エンジン。指定しない場合はPHPのデフォルトエンジンを使用します。 26 */ 27 public function __construct( 28 // コンストラクタプロパティプロモーションの例 29 // ここで宣言された $engine は、自動的に $this->engine プロパティとして利用可能になります。 30 private ?Random\Engine $engine = null 31 ) { 32 // Random\Randomizer のインスタンスを生成します。 33 // コンストラクタプロパティプロモーションで初期化された $this->engine を引数として渡します。 34 $this->randomizer = new Random\Randomizer($this->engine); 35 } 36 37 /** 38 * 指定された範囲内で整数乱数を生成します。 39 * 40 * @param int $min 最小値 (含む) 41 * @param int $max 最大値 (含む) 42 * @return int 生成された乱数 43 */ 44 public function generateInt(int $min, int $max): int 45 { 46 return $this->randomizer->getInt($min, $max); 47 } 48} 49 50// --- コードの実行例 --- 51 52// 1. エンジンを指定せずにMyRandomGeneratorのインスタンスを作成する例 53// この場合、Randomizerはデフォルトの乱数エンジンを使用します。 54echo "--- デフォルトエンジンを使用する例 ---\n"; 55$generator1 = new MyRandomGenerator(); 56echo "生成された乱数: " . $generator1->generateInt(1, 100) . "\n"; 57echo "生成された乱数: " . $generator1->generateInt(1, 100) . "\n\n"; 58 59// 2. 特定の乱数エンジンを指定してMyRandomGeneratorのインスタンスを作成する例 60// ここでは、Mersenne Twisterエンジン (Random\Mt19937) を使用します。 61echo "--- 特定のエンジン (Mt19937) を使用する例 ---\n"; 62$mtEngine = new Random\Mt19937(); 63$generator2 = new MyRandomGenerator($mtEngine); 64echo "生成された乱数: " . $generator2->generateInt(1, 100) . "\n"; 65echo "生成された乱数: " . $generator2->generateInt(1, 100) . "\n"; 66 67?>
このコードは、PHP 8.2以降で利用可能な新しい乱数生成機能であるRandom\Randomizerクラスと、PHP 8.0で導入された「コンストラクタプロパティプロモーション」を使ったクラス設計の例を示しています。
MyRandomGeneratorクラスは、内部でRandom\Randomizerのインスタンスを利用し、安全かつ柔軟に乱数を生成するためのラッパーとして機能します。その核となる__constructメソッドは、クラスがインスタンス化される際に呼び出され、乱数生成に必要な準備を行います。
引数$engineは、使用する乱数生成エンジンを指定するためのものです。この引数はオプションであり、省略された場合はPHPのデフォルトエンジンが使われます。ここで注目すべきは、private ?Random\Engine $engine = nullという記述です。これはPHP 8以降の「コンストラクタプロパティプロモーション」という機能で、引数として宣言するだけで、自動的にMyRandomGeneratorクラスのプライベートプロパティ$this->engineとして定義され、初期化されます。これにより、コードがより簡潔になり、プロパティの宣言と初期化の冗長な記述を避けることができます。
コンストラクタ内で、この初期化された$this->engineプロパティを引数として、Random\Randomizerのインスタンスが生成されます。__constructメソッド自体は、PHPのコンストラクタの慣例として、明示的な戻り値は持ちませんが、結果としてMyRandomGeneratorのインスタンスが構築されます。
generateIntメソッドは、内部のRandom\Randomizerインスタンスを利用して、指定された最小値と最大値の範囲で整数乱数を返します。サンプルコードの実行例では、エンジンを指定しないデフォルトの場合と、特定のエンジン(Random\Mt19937)を指定した場合の両方で、乱数がどのように生成されるかが示されています。このコードは、PHP 8以降のモダンなクラス設計とセキュアな乱数生成の実践的な方法を理解するのに役立ちます。
このサンプルコードは、PHP 8.2以降で利用可能なRandom\Randomizerクラスと、PHP 8.0以降で導入された「コンストラクタプロパティプロモーション」という機能を示しています。プロパティプロモーションを使用すると、コンストラクタの引数を直接クラスのプロパティとして宣言し、初期化できるため、コードをより簡潔に記述できます。Random\Randomizerのコンストラクタは、乱数エンジンを任意で指定できます。引数を省略した場合、PHPが提供する安全なデフォルトの乱数エンジンが使用されますので、特別な理由がなければ指定は不要です。セキュリティが重要な場面での乱数生成には、本クラスの利用が推奨されます。