8

マジックメソッド__call_callStatic定義された基本クラスがあるので、宣言されていないメンバー関数への呼び出しが処理されます。

非静的なものと静的なものの両方がある場合、静的演算子は、この場合のように、またはの名前と一緒に使用されるかどうかを::暗黙的に意味しないため、派生クラスから静的なものを呼び出すことはできないようです。基本クラス。これはここで説明されている特別な構文です:http://php.net/manual/pl/keyword.parent.phpstaticparent

ここでやりたいのは、呼び出す派生クラスです。__callStaticこれは、呼び出しがデフォルトで非静的呼び出しであり、によって処理されるために失敗します__call

基本クラスのメンバー関数に対して明示的に静的な呼び出しを行うにはどうすればよいですか?

<?php

class MyBaseClass {

    public static function __callStatic($what, $args)
    {
        return 'static call';
    }
    
    public function __call($what, $args)
    {
        return 'non-static call';
    }

}

class MyDerivedClass extends MyBaseClass {

    function someAction()
    {
        //this seems to be interpreted as parent::Foo()
        //and so does not imply a static call
        return MyBaseClass::Foo(); //
    }

}

$bar = new MyDerivedClass();
echo $bar->someAction(); //outputs 'non-static call'

?>

非静的メソッドを削除すると、が宣言されていないときに呼び出される__callため、スクリプトは「静的呼び出し」を出力することに注意してください。__callStatic__call

4

1 に答える 1

3

parentこのような動作を回避するには、リンクしていない空のプロキシクラスをMyBaseClass実行時に 使用できます。

class MyBaseClass {

    public static function __callStatic($what, $args)
    {
        return 'static call ' . PHP_EOL;
    }

    public function __call($what, $args)
    {
        return 'dynamic call ' . PHP_EOL;
    }
}

class ProxyClass extends MyBaseClass {
    //"Empty" class
}

class MyDerivedClass extends MyBaseClass {

    function someAction()
    {
        return ProxyClass::Foo();
    }

}

$bar = new MyDerivedClass();
var_dump($bar->someAction()); //outputs 'static call'

http://pastebin.com/7JMJUmXt

于 2012-06-22T12:52:36.087 に答える