【PHP8.x】valueプロパティの使い方

valueプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

valueプロパティは、SensitiveParameterValueクラスがラップしている実際の機密情報を保持するプロパティです。

SensitiveParameterValueクラスは、PHP 8.2で導入された#[\SensitiveParameter]属性と密接に関連しており、パスワードやAPIキーなどの、ログやデバッグバックトレースに直接表示されるべきではない機密情報を安全に扱うために設計されています。関数の引数に#[\SensitiveParameter]属性が付与されると、PHPはその引数の値を自動的にSensitiveParameterValueオブジェクトでラップします。このとき、元の機密性の高い値は、このSensitiveParameterValueオブジェクト内部のvalueプロパティに格納されます。

これにより、システムが予期せぬエラーでクラッシュした場合や、開発中にデバッグ情報が必要になった場合でも、スタックトレースやログファイルに機密情報が直接出力されることを防ぎます。たとえば、平文のパスワードがログに記録されるリスクを排除し、情報漏洩のリスクを大幅に低減できます。プログラム内でこのプロパティにアクセスすることで、SensitiveParameterValueオブジェクトに格納された元の値を取得し、必要な処理に利用することが可能です。機密情報を安全に取り扱うための重要な役割を担うプロパティです。

構文(syntax)

1public mixed $value;

引数(parameters)

戻り値(return)

mixed

このプロパティは、SensitiveParameterValue クラスが保持している実際の値を取得するために使用されます。値の型は、格納されているデータによって intstringbool など、様々です。

サンプルコード

PHP8 ValueError: SensitiveParameterValueから値を取得して整数除算する

1<?php
2
3// SensitiveParameterValue は PHP 8.2 以降で利用可能です。
4// デバッグ情報(スタックトレースなど)に機密情報が表示されるのを防ぐために使用されます。
5// この例では、その value プロパティから値を取り出した後、
6// PHP 8 で導入された ValueError が発生する可能性のあるシナリオを示します。
7
8/**
9 * 渡された SensitiveParameterValue オブジェクトから値を取り出し、
10 * それらを使って整数除算を実行します。
11 *
12 * @param SensitiveParameterValue $numeratorSensitive   割られる数(機密情報)
13 * @param SensitiveParameterValue $denominatorSensitive 割る数(機密情報)
14 */
15function performIntegerDivisionWithSensitiveValue(SensitiveParameterValue $numeratorSensitive, SensitiveParameterValue $denominatorSensitive): void
16{
17    // SensitiveParameterValue オブジェクトから実際の値を取り出します。
18    // value プロパティは mixed 型を返すため、あらゆる型の値が取り出され得ます。
19    $numerator = $numeratorSensitive->value;
20    $denominator = $denominatorSensitive->value;
21
22    echo "試行中の整数除算: " . var_export($numerator, true) . " / " . var_export($denominator, true) . "\n";
23
24    try {
25        // PHP 8 では、組み込み関数が期待される引数の値の範囲外であった場合に
26        // ValueError がスローされることがあります。
27        // 例えば、intdiv() 関数は、分母が非整数の数値である場合に ValueError をスローします (PHP 8.0 以降)。
28        $result = intdiv($numerator, $denominator);
29        echo "結果: " . $result . "\n";
30    } catch (ValueError $e) {
31        // intdiv() で、割り算の結果が整数にならないような浮動小数点数を分母に渡すなど、
32        // 不適切な値が渡された場合に発生します。
33        echo "ValueError を捕捉しました: " . $e->getMessage() . "\n";
34    } catch (TypeError $e) {
35        // 引数の型自体が期待と異なる場合 (例: 数値が期待される場所に文字列を渡す) に発生します。
36        echo "TypeError を捕捉しました: " . $e->getMessage() . "\n";
37    } catch (DivisionByZeroError $e) {
38        // 0 で割った場合に発生します。
39        echo "DivisionByZeroError を捕捉しました: " . $e->getMessage() . "\n";
40    }
41}
42
43// --------------------------------------------------------------------------------
44// サンプルケース
45// --------------------------------------------------------------------------------
46
47echo "--- ケース 1: 正常な整数値での割り算 ---\n";
48$num1 = new SensitiveParameterValue(10);
49$den1 = new SensitiveParameterValue(2);
50performIntegerDivisionWithSensitiveValue($num1, $den1);
51
52echo "\n--- ケース 2: 非整数値の分母で ValueError を発生させる ---\n";
53// intdiv() は、分母が非整数の数値の場合に ValueError をスローします (PHP 8.0 以降)。
54$num2 = new SensitiveParameterValue(10);
55$den2 = new SensitiveParameterValue(2.5); // ValueError の原因となる非整数値
56performIntegerDivisionWithSensitiveValue($num2, $den2);
57
58echo "\n--- ケース 3: ゼロ除算で DivisionByZeroError を発生させる ---\n";
59$num3 = new SensitiveParameterValue(10);
60$den3 = new SensitiveParameterValue(0); // DivisionByZeroError の原因となる 0
61performIntegerDivisionWithSensitiveValue($num3, $den3);
62
63echo "\n--- ケース 4: 不適切な型の引数で TypeError を発生させる (文字列) ---\n";
64// intdiv() は数値型を期待するため、文字列を渡すと TypeError が発生します。
65$num4 = new SensitiveParameterValue("hello"); // TypeError の原因となる文字列
66$den4 = new SensitiveParameterValue(2);
67performIntegerDivisionWithSensitiveValue($num4, $den4);
68
69?>

PHPのSensitiveParameterValueクラスは、PHP 8.2以降でデバッグ情報などに機密情報が表示されるのを防ぐために導入されました。そのvalueプロパティは、このクラスに格納された実際の値を取り出すために使用されます。引数はなく、戻り値はmixed型であるため、数値、文字列、オブジェクトなど、あらゆる型の値を取り出すことができます。

このサンプルコードでは、SensitiveParameterValueオブジェクトからvalueプロパティを使って値を取り出し、それらの値を使ってintdiv()関数による整数除算を実行しています。PHP 8以降では、intdiv()のような組み込み関数が、期待される引数の値の範囲外であった場合にValueErrorをスローするようになりました。特に、intdiv()関数に分母として非整数値が渡された際にこのValueErrorが発生するシナリオを示しています。

コードは、try...catchブロックでValueErrorを捕捉し、不適切な値が渡された場合のエラー処理方法を提示しています。また、引数の型が異なる場合のTypeErrorや、ゼロで除算した場合のDivisionByZeroErrorも捕捉する例も含まれており、堅牢なコードを書くためのエラーハンドリングの基本を学ぶことができます。

SensitiveParameterValue::valueプロパティはmixed型を返すため、値を取り出した後はその型や値の範囲を必ず確認してください。PHP 8では、intdiv()などの組み込み関数に期待されるの範囲外の引数を渡すとValueErrorが発生します。また、型が不適切な場合はTypeError、ゼロで割るとDivisionByZeroErrorが起こります。これらの予期せぬエラーを防ぐため、try-catchブロックを使って適切な例外処理を行うことが、安全で堅牢なコードを書く上で非常に重要です。SensitiveParameterValue自体はPHP 8.2以降の機能ですが、値の確認と例外処理の原則は、PHPのどのバージョンでもプログラミングの基本です。

SensitiveParameterValue の value プロパティで値を取得する

1<?php
2
3// SensitiveParameterValue は PHP 8.2 で導入されたクラスです。
4// このクラスは、機密性の高い情報を安全に扱うための「値オブジェクト」として機能します。
5// 具体的には、スタックトレースなどのデバッグ出力に実際の値が表示されないように、値をラップします。
6// 開発者が手動で値をこのオブジェクトにラップすることも、#[SensitiveParameter] 属性を通じてPHPが自動で行うこともできます。
7
8/**
9 * SensitiveParameterValue オブジェクトの基本的な使い方を示す関数。
10 * 機密性の高い値をラップし、必要に応じてその「value」プロパティから元の値を取り出す方法を実演します。
11 */
12function demonstrateSensitiveParameterValue(): void
13{
14    // 機密性の高いと想定されるデータを定義します。
15    $secretPassword = 'mySuperSecretPassword123!';
16
17    echo "--- 元のデータ ---\n";
18    echo "元のパスワード: " . $secretPassword . "\n\n";
19
20    // SensitiveParameterValue オブジェクトで機密データをラップします。
21    // これにより、例えばデバッグログやエラーレポートなどでこの値が意図せず露出するのを防ぎます。
22    $sensitiveValueObject = new SensitiveParameterValue($secretPassword);
23
24    echo "--- SensitiveParameterValue オブジェクトでラップした後 ---\n";
25    echo "ラップされたオブジェクトの型: " . get_class($sensitiveValueObject) . "\n";
26    // 注意: SensitiveParameterValue オブジェクト自体を直接出力しても、元の値は通常表示されません。
27
28    echo "オブジェクトから「value」プロパティを通じて元の値にアクセス:\n";
29    // `value` プロパティにアクセスすることで、オブジェクトにラップされた実際のデータを取得できます。
30    // このプロパティの戻り値型は mixed なので、あらゆる型の値を受け取ることができます。
31    $retrievedPassword = $sensitiveValueObject->value;
32    echo "取得されたパスワード: " . $retrievedPassword . "\n\n";
33
34    echo "--- 検証 ---\n";
35    if ($secretPassword === $retrievedPassword) {
36        echo "元の値とオブジェクトから「value」プロパティを通じて取得した値は一致します。\n";
37    } else {
38        echo "値が一致しません。\n";
39    }
40}
41
42// 関数を実行します。
43demonstrateSensitiveParameterValue();
44
45?>

PHP 8.2で導入されたSensitiveParameterValueクラスは、パスワードなどの機密性の高い情報を安全に扱うためのものです。このクラスに値をラップすることで、スタックトレースやデバッグ出力などで機密情報が意図せず表示されるのを防ぎます。本リファレンスが示すvalueプロパティは、このSensitiveParameterValueオブジェクトに格納された実際の機密データを取り出すために使用されます。このプロパティに引数はなく、戻り値はmixed型であるため、文字列や数値、オブジェクトなど、あらゆるデータ型を格納し、元の形式で取得することができます。サンプルコードでは、機密性の高いパスワードをSensitiveParameterValueオブジェクトでラップした後、$sensitiveValueObject->valueのように記述することで、ラップされたオブジェクトから元のパスワードを安全に取り出せる様子を示しています。これにより、情報を保護しつつ、必要な時にのみデータにアクセスできる、安全なプログラミングが可能になります。

SensitiveParameterValueクラスはPHP 8.2以降で利用可能で、パスワードなどの機密情報をデバッグ出力やログなどから保護する目的で使われます。機密データをこのオブジェクトでラップした場合、その値は$object->valueプロパティを通じてのみ取得してください。オブジェクトを直接出力しても、通常は元の値が表示されない点にご注意ください。このクラスは、スタックトレースなどで値が意図せず露出するのを防ぐものであり、データの永続化における暗号化など、より広範なセキュリティ対策とは異なることを理解して利用してください。valueプロパティはmixed型であるため、取り出した値の型に応じて適切な処理が必要です。