[PHP-users 31121] Re: メソッドの静的呼び出しについて

Ihara Shinyo shinyo @ ihara-inc.com
2006年 12月 25日 (月) 18:06:31 JST


  伊原といいます。

On 2006/12/25, at 10:10, bobchin wrote:
> 継承先で親クラスのメソッドを静的に呼び出した際に、
> 親クラス側で呼び出し元を特定できないかを考えていますが、
> よい方法が浮かびません。
> なにかヒントがあればと思い、投稿しました。
>
> やりたいことは以下の通りです。
>
> class ClassA {
>     function method()
>     {
>         // ここで「ClassB」を取得したい・・・
>     }
> }
>
> class ClassB extends ClassA {
> }
>
> ClassB::method()を呼び出したときに、親クラスClassA上で 
> 「ClassB」から
> コールされたことを判断る方法(呼び出しもとのクラスが知りたい) 
> です。

私も同様のことを実現したくて困っています。
派生クラスでstaticなメソッドをオーバライドすることで、
一応、親クラスで派生クラス名を取得することができました。
ただ、派生クラス毎にオーバライドしないといけないので、
あまり嬉しくありません。バージョンはPHP 5.2 + FreeBSD 6.1 
です。

<?php

class A
{
     public static function f()
     {
         $bt = debug_backtrace();
         $class = $bt[1]['class'];
         echo $class;
     }
}

class B extends A
{
     public static function f()
     {
         parent::f();
     }
}

B::f();

?>

個人的にはdebug_backtraceの動作がおかしいのでは?と思いま 
す。
Bug #30828 (http://bugs.php.net/bug.php?id=30828)によると
5.0で対策済みのはずなんですけど、
5.1辺りの object を返すようにした変更でまた問題が表面化し 
たんでしょうか。

以上、ご参考まで。



PHP-users メーリングリストの案内