初期化と参照
目次
- 解説
- 1. 最初に代入できない場合
- 2. 初期化とは
- 3. なるべく初期化は使わない
解説
1. 最初に代入できない場合
例えば、変数に条件によって異なる値を代入したいなど、値が決定していないため代入できない場合があります。
static function practiceInitialize() {
$price; // 何も代入していない
$ticket = '通常券'; // (ここは処理時の入力で変わる想定)
if ($ticket == '通常券') {
$price = '料金は1000円です。';
}
if($ticket == '特別券') {
$price = '料金は500円です。';
}
Logger::echo($price); // NULL の可能性がある
}
ここで、10行目のように「変数の値を使う・変数の値を読み取る」ことを参照すると言います。PHPでは変数は参照するまでの間に値を代入しなかった場合、値は「null」になります。
もしもticketが「通常券・特別券」以外の場合には、5・8行目の代入している行が条件分岐(if文)によって実行されなくなるため、10行目でpriceを参照した時点で値はnullになり、後続のコードでpriceに値が存在する前提だった場合エラーとなる可能性があります。
2. 初期化とは
ならばとりあえずその型にあった値=初期値を入れておこう、という対処を初期化と言います。
static function practiceInitialize() {
$price = ''; // 長さ0の文字列=空文字で初期化しておく
$ticket = '通常券'; // (ここは処理時の入力で変わる想定)
if ($ticket == '通常券') {
$price = '料金は1000円です。';
}
if ($ticket == '特別券') {
$price = '料金は500円です。';
}
Logger::echo($price);
}
3. なるべく初期化は使わない
前項のサンプルコードはエラーが解消され、ticketは「通常券・特別券」のいずれか、という暗黙のルールを守っていれば問題なさそうです。
しかし、時と共に暗黙のルールは忘れ去られます。「通常券」の名称を「当日券」に変更しただけで、「エラーなく動いているのにpriceが空っぽになる!」という問題が起きるのです。
このケースでは、次のサンプルコードのような構成を検討すべきです。
static function practiceInitialize() {
$price = '料金は1000円です。'; // 初期化ではなく通常時の値
$ticket = '通常券'; // (ここは処理時の入力で変わる想定)
if ($ticket == '特別券') {
$price = '料金は500円です。';
}
Logger::echo($price); // 特別な場合だけ値が書き換えられる
}
その変数がいちばん取り得る値を最初に代入しておくことは、初期値という目的にそぐわない値の排除・条件分岐の削減・変更時の修正箇所削減などのメリットがあります。
初期値だったら(nullだったら)エラー、などの処理が必要な場合以外では、変数にあらかじめ代入しておける値を見つけましょう。