shinke1987.net
雑多な備忘録等のはず。
他のカテゴリ・タブ
目次
PR

遅延静的束縛

2023-06-18 2023-06-18
カテゴリ: PHP

参考Webページ

概要

遅延静的束縛( Late Static Bindings )と呼ばれる機能がある。
これを使用すると、静的継承のコンテキストで呼び出し元のクラスを参照できるようになる。

遅延静的束縛は非転送コールのクラス名を保存するらしい。
staticメソッドの場合、明示的に指定されたクラスとなる。(::演算子の左側に書かれたもの)
staticメソッド以外の場合、そのオブジェクトのクラスとなる。

転送コールとは、selff:: / parent:: / static:: による::演算子を使ったコールのこと。
(あるいはクラス階層の中でのforward_static_call()によるコールのこと)

get_called_class()関数を使うとコール元のクラス名を文字列で取得できる。
static::はこのクラスのスコープとなる。
(遅延静的束縛が使われている場合、コードを読み解く時に使える関数)

動作確認コード

次のコードを実行すると簡易動作確認ができる。

<?php

class A {
    public static function who() {
        echo 'A::who()_echo : ' . __CLASS__ . "\n";
    }

    public static function test() {
        var_dump('A::test()_get_called_class : ' . get_called_class());
        self::who();
        static::who();
    }
}

class B extends A {
    public static function who() {
        var_dump('B::who()_get_called_class : ' . get_called_class());
        echo 'B::who()_echo : ' . __CLASS__;
    }
}

B::test();

動作確認コードの結果

string(30) "A::test()_get_called_class : B"
A::who()_echo : A
string(29) "B::who()_get_called_class : B"
B::who()_echo : B
同一カテゴリの記事