Quantcast
Channel: 親方、空から覚え書きが!
Viewing all articles
Browse latest Browse all 15

遅延静的束縛と forward_static_call()

$
0
0

遅延静的束縛と関連のあるお話です。クラスメソッドを呼び出す際に parent, self, static キーワードを使わず、クラス名を指定してやると呼び出し元がそのクラスになります。

<?php

class A
{
    public static function method()
    {
        echo __METHOD__, ' called by ', get_called_class(), PHP_EOL;
    }
}

class B extends A
{
    public static function method()
    {
        echo __METHOD__, ' called by ', get_called_class(), PHP_EOL;
        return A::method(); // 遅延静的束縛のための情報は引き継がれない
    }
}

class C extends B
{
    public static function method()
    {
        echo __METHOD__, ' called by ', get_called_class(), PHP_EOL;
        return parent::method();
    }
}

C::method();
C::method called by C
B::method called by C
A::method called by A

forward_static_call() 及び forward_static_call_array() は遅延静的束縛の情報を残したままメソッドを呼び出すために(も?)用意されました。

<?php

class A
{
    public static function method()
    {
        echo __METHOD__, ' called by ', get_called_class(), PHP_EOL;
    }
}

class B extends A
{
    public static function method()
    {
        echo __METHOD__, ' called by ', get_called_class(), PHP_EOL;
        return  forward_static_call(array('A', 'method')); // 遅延静的束縛のための情報を引き継ぐ
    }
}

class C extends B
{
    public static function method()
    {
        echo __METHOD__, ' called by ', get_called_class(), PHP_EOL;
        return parent::method();
    }
}

C::method();
C::method called by C
B::method called by C
A::method called by C

継承関係にないクラスを指定しても引き継がれません。また親から子を指定しても引き継がれません。その他の制限として、クラススコープ以外で呼び出すと E_ERROR が発生します。後は call_user_func() 及び call_user_func_array() と使い方は同じのようです。

どんな場面で使うのかは、…どうなんだろう?


Viewing all articles
Browse latest Browse all 15

Trending Articles