【PHP】継承元の静的変数(static)を、継承先の変数で上書きする

Laravelで開発をしていると、静的変数でクラスのパラメータを設定する場面がよくあります。
継承に共通関数をまとめられるので、ソースの見通しがよくなります。

今回は、静的変数を継承から取得する方法について記載します。

継承元の変数を上書きする方法

例えば、次のように継承の関数で使う変数を、継承の設定によって動的に変わるようにしたいと思います。

f:id:nakahashi_h:20200928185607j:plain

尚、イメージしやすくするために、上書きという言葉を使っていますが、継承と継承の変数は別物です。
厳密には上書きではありませんのでご注意ください。

継承の関数から継承の静的変数を呼び出すには、staticで呼び出します。

/**
 * 継承元クラス
 * @package App\Http\Controller\Contact
 */
class ParentClass {
    protected static $text = '元のテキスト';

    public static function getText() {
        return static::$text;       // 継承元から(ChildClass::$text)を取得している
    }
}

/**
 * 継承先クラス
 * @package App\Http\Controller\Contact
 */
class ChildClass extends ParentClass {
    protected static $text = '新しいテキスト';
}

echo ChildClass::getText();
// 新しいテキスト

継承ChildClass)から継承ParentClass)を参照する事を、遅延静的束縛と言います。

www.php.net

よくある間違い

自分のクラスの静的変数を呼び出す時は、selfを使います。
その要領でselfを使うと継承の変数を呼び出す事が出来ません。

あくまで、自分のクラスの変数を呼び出しただけで、継承を見ているわけではありません。

/**
 * 継承元クラス
 * @package App\Http\Controller\Contact
 */
class ParentClass {
    protected static $text = '元のテキスト';

    public static function getText() {
        return self::$text;     // ParentClass::$textを取得している
    }
}

/**
 * 継承先クラス
 * @package App\Http\Controller\Contact
 */
class ChildClass extends ParentClass {
    protected static $text = '新しいテキスト';
}

echo ChildClass::getText();
// 元のテキスト

Tips

静的変数の呼び出し方色々

静的な呼び出し方には次のように色々な方法があります。

変数 概要
parent 継承から継承の変数を取得する
static 継承から継承の変数を取得する
self 自分自身のクラスの変数を取得する

図にすると次のような関係性です。

parent

f:id:nakahashi_h:20200928182409j:plain

static

f:id:nakahashi_h:20200928182411j:plain

self

f:id:nakahashi_h:20200928182414j:plain

©︎2017-2018 WebSandBag