Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】Random\Engine\Mt19937::__construct()メソッドの使い方

__constructメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

__constructメソッドは、Random\Engine\Mt19937クラスの新しいインスタンスを初期化する際に自動的に実行される特別なメソッドです。Random\Engine\Mt19937は、PHP 8で導入されたRandom拡張機能の一部であり、メルセンヌ・ツイスターアルゴリズムに基づき高品質な擬似乱数を生成するエンジンを提供します。

このコンストラクタの主な役割は、乱数生成器の初期設定を行うことです。インスタンス作成時に、乱数生成の出発点となる「シード値」をオプションで指定できます。同じシード値を指定すると、毎回同じ乱数の数列が生成されるため、テストの再現性確保などに役立ちます。

シード値を指定しなかった場合は、システムが自動的にランダムなシード値を選択します。これにより、インスタンスを作成するたびに異なる乱数列が生成され、予測不可能な多様な結果が得られます。この__constructメソッドを通じて、乱数エンジンの挙動をアプリケーションの要件に合わせて柔軟に制御できます。

構文(syntax)

1<?php
2
3$engine = new Random\Engine\Mt19937(12345);
4
5?>

引数(parameters)

int|string|array|null $seed = null, int $mode = 0

  • int|string|array|null $seed = null: 乱数生成器のシード値を指定します。指定しない場合はランダムな値が使用されます。
  • int $mode = 0: 乱数生成器のモードを指定します。

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP 8 コンストラクタプロモーションと Mt19937 エンジンを扱う

1<?php
2
3// PHP 8 で導入された「コンストラクタプロモーション」と
4// 「Random\Engine\Mt19937」クラスのコンストラクタの利用例を示すサンプルコードです。
5// システムエンジニアを目指す初心者の方にも理解しやすいように、基本的な概念に焦点を当てています。
6
7/**
8 * CustomMt19937Generatorクラスは、Random\Engine\Mt19937エンジンを内部に持ち、
9 * その初期化にPHP 8のコンストラクタプロモーションを利用する方法を示します。
10 */
11class CustomMt19937Generator
12{
13    // Random\Engine\Mt19937のインスタンスを保持するプロパティです。
14    private Random\Engine\Mt19937 $engine;
15
16    /**
17     * コンストラクタプロモーションを使用して、$seed と $mode をプロパティとして宣言し、
18     * 自動的に初期化します。これらはRandom\Engine\Mt19937のコンストラクタ引数に対応します。
19     *
20     * @param int|string|array|null $seed 乱数生成エンジンのシード値。nullの場合、PHPが適切なシードを選択します。
21     * @param int $mode シード値の解釈モード。通常は0を使用します。
22     */
23    public function __construct(
24        private int|string|array|null $seed = null,
25        private int $mode = 0
26    ) {
27        // コンストラクタプロモーションにより、$this->seed と $this->mode は既にプロパティとして宣言され、
28        // 引数として渡された値で初期化されています。
29        // これらのプロパティを利用して、Random\Engine\Mt19937のインスタンスを生成します。
30        // Random\Engine\Mt19937::__construct の引数は、リファレンス情報に準拠しています。
31        $this->engine = new Random\Engine\Mt19937($this->seed, $this->mode);
32    }
33
34    /**
35     * このインスタンスが内部で使用しているRandom\Engine\Mt19937エンジンを取得します。
36     *
37     * @return Random\Engine\Mt19937
38     */
39    public function getEngine(): Random\Engine\Mt19937
40    {
41        return $this->engine;
42    }
43
44    /**
45     * 設定されたシード値を取得します。
46     *
47     * @return int|string|array|null
48     */
49    public function getSeed(): int|string|array|null
50    {
51        return $this->seed;
52    }
53
54    /**
55     * 設定されたモードを取得します。
56     *
57     * @return int
58     */
59    public function getMode(): int
60    {
61        return $this->mode;
62    }
63}
64
65// ----------- 使用例 -----------
66// CustomMt19937Generatorのインスタンスを作成し、コンストラクタプロモーションの動作を確認します。
67
68// 1. デフォルト引数でのインスタンス作成
69echo "--- デフォルト引数でのインスタンス化 ---\n";
70$defaultGenerator = new CustomMt19937Generator();
71echo "Seed: " . var_export($defaultGenerator->getSeed(), true) . "\n"; // null が表示される
72echo "Mode: " . $defaultGenerator->getMode() . "\n"; // 0 が表示される
73echo "Engine class: " . get_class($defaultGenerator->getEngine()) . "\n\n";
74
75// 2. 特定のシード値とモードでのインスタンス作成
76echo "--- 特定の引数でのインスタンス化 ---\n";
77$mySeed = 12345;
78$myMode = 1;
79$customGenerator = new CustomMt19937Generator(seed: $mySeed, mode: $myMode);
80echo "Seed: " . $customGenerator->getSeed() . "\n"; // 12345 が表示される
81echo "Mode: " . $customGenerator->getMode() . "\n"; // 1 が表示される
82echo "Engine class: " . get_class($customGenerator->getEngine()) . "\n\n";
83
84// Random\Engine\Mt19937 は直接乱数を生成するのではなく、Random\Randomizer クラスに渡して使用します。
85$randomizer = new Random\Randomizer($customGenerator->getEngine());
86echo "Generated random number using custom engine (1-100): " . $randomizer->getInt(1, 100) . "\n\n";
87
88// 3. 配列をシード値として使用する例
89echo "--- 配列シードでのインスタンス化 ---\n";
90$arraySeed = [10, 20, 30];
91$arrayGenerator = new CustomMt19937Generator(seed: $arraySeed);
92echo "Seed: " . var_export($arrayGenerator->getSeed(), true) . "\n"; // 配列の内容が表示される
93echo "Mode: " . $arrayGenerator->getMode() . "\n"; // 0 が表示される (デフォルト値)
94echo "Engine class: " . get_class($arrayGenerator->getEngine()) . "\n\n";
95
96$arrayRandomizer = new Random\Randomizer($arrayGenerator->getEngine());
97echo "Generated random number using array-seeded engine (1-100): " . $arrayRandomizer->getInt(1, 100) . "\n";
98

このサンプルコードは、PHP 8で導入された「コンストラクタプロモーション」と、乱数生成エンジンの基盤となるRandom\Engine\Mt19937クラスの初期化方法を、システムエンジニアを目指す初心者向けに解説します。

CustomMt19937Generatorクラスのコンストラクタでは、Random\Engine\Mt19937の初期化に必要な$seed$mode引数を、PHP 8の新機能である「コンストラクタプロモーション」を使って受け取ります。コンストラクタプロモーションとは、コンストラクタの引数にアクセス修飾子(privateなど)を付与するだけで、その引数を自動的にクラスのプロパティとして宣言し、同時に初期化する便利な機能です。これにより、コードが簡潔になります。

Random\Engine\Mt19937::__constructメソッドは、乱数生成エンジンの初期状態を設定するために使用されます。引数$seedには、乱数の元となる整数、文字列、配列、またはnullを指定できます。nullの場合、PHPが適切なシード値を自動的に選択します。引数$modeはシード値の解釈方法を指定し、通常はデフォルトの0を使用します。このコンストラクタ自体はインスタンスを初期化するだけであり、特定の戻り値はありません。

サンプルコードでは、CustomMt19937Generatorのインスタンスを異なるシード値で作成し、コンストラクタプロモーションの動作を確認します。初期化されたRandom\Engine\Mt19937エンジンは、実際に乱数を生成するRandom\Randomizerクラスに渡して利用されます。

このサンプルコードでは、PHP 8のコンストラクタプロモーションを活用し、プロパティの宣言と初期化を簡潔に行っています。Random\Engine\Mt19937は乱数生成の「エンジン」であり、直接乱数を生成するものではなく、必ずRandom\Randomizerクラスに渡して利用する点が重要です。コンストラクタの$seed引数は乱数の初期値を決め、同じシード値からは常に同じ乱数列が生成されます。これによりテストの再現性は高まりますが、セキュリティ上重要な場面では予測可能なシード値の使用は避けるべきです。nullを指定するとシステムが適切なシードを選びます。$mode引数は通常デフォルトの0で問題ありません。

PHP 8 コンストラクタプロパティプロモーションで乱数生成する

1<?php
2
3// このコードはPHP 8.2以降で利用可能な \Random\Engine\Mt19937 クラスを使用します。
4// そのため、PHP 8.0や8.1ではこのコードは動作しませんのでご注意ください。
5
6/**
7 * カスタム乱数ジェネレータクラス。
8 * PHP 8 で導入された「コンストラクタプロパティプロモーション」の利用例を示します。
9 * 内部で \Random\Engine\Mt19937 を使用して乱数を生成します。
10 */
11class MyCustomRandomGenerator
12{
13    /**
14     * @var \Random\Engine\Mt19937 内部で使用する乱数エンジンインスタンス。
15     */
16    private \Random\Engine\Mt19937 $engine;
17
18    /**
19     * MyCustomRandomGenerator のコンストラクタ。
20     *
21     * PHP 8 の「コンストラクタプロパティプロモーション」機能により、
22     * 引数 $seed と $mode は、それぞれプライベートで読み取り専用のプロパティとして自動的に定義され、初期化されます。
23     * これにより、冗長なプロパティの宣言とコンストラクタ内での代入が不要になります。
24     *
25     * @param int|string|array|null $seed 乱数エンジンのシード値。nullの場合、ランダムなシードが使用されます。
26     *                                    \Random\Engine\Mt19937 の __construct メソッドにそのまま渡されます。
27     * @param int $mode シードの利用モード。デフォルトは0です。
28     *                  \Random\Engine\Mt19937 の __construct メソッドにそのまま渡されます。
29     */
30    public function __construct(
31        private readonly int|string|array|null $seed = null,
32        private readonly int $mode = 0
33    ) {
34        // コンストラクタプロパティプロモーションによって定義された $this->seed と $this->mode を使用して、
35        // 内部の \Random\Engine\Mt19937 インスタンスを初期化します。
36        $this->engine = new \Random\Engine\Mt19937($this->seed, $this->mode);
37    }
38
39    /**
40     * 乱数エンジンから次の乱数を生成します。
41     * このメソッドを呼び出すことで、実際の乱数バイト列が取得できます。
42     *
43     * @return string 生成された乱数のバイト列。
44     */
45    public function generate(): string
46    {
47        return $this->engine->generate();
48    }
49
50    /**
51     * コンストラクタプロパティプロモーションによって定義されたシード値を取得します。
52     *
53     * @return int|string|array|null 設定されたシード値。
54     */
55    public function getSeed(): int|string|array|null
56    {
57        return $this->seed;
58    }
59
60    /**
61     * コンストラクタプロパティプロモーションによって定義されたモード値を取得します。
62     *
63     * @return int 設定されたモード値。
64     */
65    public function getMode(): int
66    {
67        return $this->mode;
68    }
69}

このサンプルコードは、PHP 8で導入された新しい乱数生成機能である\Random\Engine\Mt19937クラスと、PHP 8の「コンストラクタプロパティプロモーション」機能の利用例を示しています。\Random\Engine\Mt19937は、予測不能な高品質な乱数を生成するためのエンジンの一つで、その__constructメソッドは乱数生成の初期設定を行います。

コンストラクタの引数$seedは、乱数系列を初期化するための値です。整数、文字列、配列、またはnullが指定でき、nullの場合はシステムが自動的にランダムなシードを設定します。$modeは、シードの利用方法を指定する整数値で、デフォルトは0です。これらの引数をもとに、乱数エンジンは特定の乱数系列を生成する準備をします。

サンプルコードのMyCustomRandomGeneratorクラスのコンストラクタでは、PHP 8で追加された「コンストラクタプロパティプロモーション」が使われています。これにより、コンストラクタの引数である$seed$modeが、private readonlyプロパティとして自動的に定義され、初期化されます。開発者は冗長なプロパティ宣言やコンストラクタ内での代入処理を省略でき、コードをより簡潔に記述できるようになります。

このコンストラクタ内で、プロモーションされた$this->seed$this->modeの値を使って、内部的に\Random\Engine\Mt19937のインスタンスを生成し、初期化しています。これにより、MyCustomRandomGeneratorは、指定されたシードとモードに基づいて乱数を生成できるようになります。なお、\Random\Engine\Mt19937クラス自体はPHP 8.2以降で利用可能ですのでご注意ください。

このサンプルコードは、PHP 8.2以降で導入された\Random\Engine\Mt19937クラスを利用するため、PHP 8.0や8.1では実行できませんのでご注意ください。PHP 8で導入された「コンストラクタプロパティプロモーション」機能により、コンストラクタの引数をprivate readonlyとして直接プロパティ定義しており、プロパティの宣言と初期化を簡潔に行っています。これにより、コードの記述量を減らし、一度設定されたプロパティの値が意図せず変更されるのを防いでいます。乱数のシード値$seedは、nullを指定するとランダムな値が使用されますが、テストなどで特定の乱数列の再現性が必要な場合は、明示的に固定値を設定してください。

関連コンテンツ