初期化と参照

目次
  • 解説
  • 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だったら)エラー、などの処理が必要な場合以外では、変数にあらかじめ代入しておける値を見つけましょう。