Laravelで開発をしていると、静的変数でクラスのパラメータを設定する場面がよくあります。
継承元に共通関数をまとめられるので、ソースの見通しがよくなります。
今回は、静的変数を継承先から取得する方法について記載します。
継承元の変数を上書きする方法
例えば、次のように継承元の関数で使う変数を、継承先の設定によって動的に変わるようにしたいと思います。
尚、イメージしやすくするために、上書きという言葉を使っていますが、継承元と継承先の変数は別物です。
厳密には上書きではありませんのでご注意ください。
継承元の関数から継承先の静的変数を呼び出すには、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
)を参照する事を、遅延静的束縛と言います。
よくある間違い
自分のクラスの静的変数を呼び出す時は、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 | 自分自身のクラスの変数を取得する |
図にすると次のような関係性です。