ちょっと面倒なタイトルだけど、やりたいこととしては
- 親クラスに何らかのメソッドがあって、子クラスでもそれを使う(継承)
- メソッド自体は親クラスにしか書かない
- でも呼ばれた子クラスのファイル名(とかその他)が知りたい
ということがあって、普通に debug_backtrace()
とか使ったんだけど、返ってくるのは親クラスのファイル名だった。
例えば以下の場合、実行してるのは子クラス( child.php
)だけど、返るのは親クラスのファイル名( parent.php
)。
実行してるのが parant.php
だからそうなるみたい。
parent.php(失敗例)
class ParentClass
{
public function trace()
{
$trace = debug_backtrace();
// ↓呼び出してるのはこのファイル(parent.php)なので、それが返る
return basename($trace[0]['file']);
}
}
include('child.php');
$child = new ChildClass();
echo $child->trace(); // parent.php
child.php(失敗例)
class ChildClass extends ParentClass
{
}
ReflectionClass を使うとうまくいった。
parent.php(成功例)
class ParentClass
{
public function trace()
{
$trace = debug_backtrace();
// ↓これで呼び出し元のクラスの情報を取得
$ref = new ReflectionClass($trace[0]['object']);
return basename($ref->getFilename());
}
}
include('child.php');
$child = new ChildClass();
echo $child->trace(); // child.php
child.php(成功例)
class ChildClass extends ParentClass
{
}
子のファイルごとにエラーとかをまとめたいけど親クラス内だけで処理したかった、みたいなやつで使ったので備忘のためw