PHP(PHP5)の質問です。
あるクラスのメソッドから、別のクラスのメソッドを呼び出しています。
呼び出された側のメソッド内で、「呼び出し元のクラス名」を取得することは可能でしょうか?
インスタンスオブジェクトを渡せばgetClass()でクラス名が取得できますが、
オブジェクトを渡すことなく「呼び出し元のクラス名」を取得したいと思います。
現行のPHPではできないようにも思いますが、もし可能であればその方法を教えてください。
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も大きくなるので重いかもしれません.
さっそくの回答、ありがとうございます。
なるほどbacktraceで可能そうですね。
今回は速度的なことは問題ないのですが、クラスの再利用時は気になる可能性はありますね。