【詳しい内容をコメント欄に追記しています。そちらもご覧になってから回答をお願いします。】


PHP(PHP5)の質問です。
あるクラスのメソッドから、別のクラスのメソッドを呼び出しています。
呼び出された側のメソッド内で、「呼び出し元のクラス名」を取得することは可能でしょうか?

インスタンスオブジェクトを渡せばgetClass()でクラス名が取得できますが、
オブジェクトを渡すことなく「呼び出し元のクラス名」を取得したいと思います。
現行のPHPではできないようにも思いますが、もし可能であればその方法を教えてください。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/04/12 14:45:53
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kent013 No.1

回答回数38ベストアンサー獲得回数7

ポイント100pt

PHPの仕組みとしてはできませんが,Backtraceを使うことで可能です.

http://jp2.php.net/debug_backtrace]

<?php
class Logger{
    public static function getLocation(){
        $trace = debug_backtrace();
        $locate =  "at ";
        if (isset($trace[1])){
            if(isset($trace[1]["class"])) {
                $locate .= $trace[1]["class"] . "::";
            }
        }
        if ($trace[1]["function"] != null) {
            $locate .= $trace[1]["function"] . "()";
        }
        $locate .= " in " . $trace[1]["file"] . "#" . $trace[0]["line"];
        return $locate;
    }
}

class ClassTest{
    public function test1(){
        var_dump(Logger::getLocation());
    }
    public function test2(){
        $logger = new Logger();
        var_dump($logger->getLocation());
    }
}
function functionTest(){
    var_dump(Logger::getLocation());
}

$t = new ClassTest();
$t->test1();
$t->test2();
functionTest();
?>

速度的には,どうでしょう.

この程度のサンプルスクリプトだと一瞬だと思いますが,大きな仕組みになるとtraceも大きくなるので重いかもしれません.

id:wizemperor

さっそくの回答、ありがとうございます。

なるほどbacktraceで可能そうですね。

今回は速度的なことは問題ないのですが、クラスの再利用時は気になる可能性はありますね。

2008/04/12 14:45:29
  • id:wizemperor
    質問の追加説明です。

    class Filter {
     // 省略...

     public static function execute($filter) { // 静的メソッド
       // ここで呼び出しもとのクラス名を取得したい
       // UserClassクラスから呼び出された場合は、クラス名 'UserClass' を取得することは可能か?

       // 呼び出し元のクラスのメソッド クラス名::filter{$filter}() を呼び出したい。
       // 例えば、UserClassから Filter::execute('User') で呼び出された場合、 UserClass::filterUser() を呼び出したい。

       // call_user_func( array(???, 'filter' . $filter) );
     }
    }


    class UserClass {
     // 省略...

     public function method() {
       Filter::execute('User');
     }

     public function filterUser() {
       // 省略...
     }
    }



    早い話が、呼び出し元( UserClass::method() )のthisキーワードが指すものを取得できればいいのですが、それを実現することはできるでしょうか?
  • id:kent013
    追記です.
    昔,似たようなことがしたくて検証をしたことがあります.
    http://d.hatena.ne.jp/kent013/20080319/1205895187
    結局インスタンスを渡すようなことになっています.
  • id:wizemperor
    ありがとうございます。そちらも参考にさせていただきます。

    結局、今回はbacktraceを使う方法にしました。
    期待通りの動作になりましたので、お礼まで。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません