查看类、方法、函数所在的文件 ¶
作者:KK
发表日期:2019.08.19
获取类和函数的文件位置 ¶
平时进行调试工作时,有时候是需要知道$xxx->yyy()->zzz(123)
这样的代码到底是怎么运行的,然而往往由于这个项目是基于个大框架(代码调用链复杂),不容易知道要去看哪个文件的代码并加入调试代码。以下代码可以让你轻松了解它们在哪个位置:
复制以下代码到一个单独的文件(如命名为test.php
),在命令行执行php test.php
或者以经典模式运行网站文件也可以看效果
class AAA{
public function bbb(){
echo 'bbb';
}
}
function ccc(){
echo 'ccc';
}
$aaa = new AAA();
print_r([
//传递object实例变量给 ReflectionClass 进行实例化,取得文件路径
'实例aaa它的类所在的路径' => (new \ReflectionClass($aaa))->getFilename(),
//传递类名给 ReflectionClass 进行实例化,也可以取得文件路径
'AAA类所在的路径' => (new \ReflectionClass('AAA'))->getFilename(),
//'有命名空间就要带上命名空间' => (new \ReflectionClass('aa\bb\cc\DD'))->getFilename(),
//传递函数名给 ReflectionFunction 进行实例化,取得文件路径
'ccc函数所在的路径' => (new \ReflectionFunction('ccc'))->getFilename(),
]);
以上代码用到了一些3年经验以下新人所不熟悉的ReflectionClass
和ReflectionFunction
,这是一系列以Reflection
为前缀作为类名的东西,还有更多,详情查看官方文档 反射,但你可以先不急着看,以后再慢慢了解,或者上网搜关键词“PHP反射”
这一套东西我们又称为“反射类”,可以将反射类理解成对 类、方法、属性、函数、参数 等等东西的 分析器
,它能告诉你这些在PHP环境里的事物相关的数据,比如短类名和完整类名(不带命名空间和带命名空间),所有的命名空间,所在的文件位置,所在的文件行起始和结束行号,注释,它里面有多少属性,各个属性叫什么名字,是继承来的还是自身声明的,继承谁,声明的文件位置等等……一切通常所需要的分析数据都能get出来,有兴趣可以玩玩,但不必完全玩透,初步了解一下即可。它这整套东西更多是用在框架的封装领域,以实现框架特性。
获取方法的文件位置 ¶
即使知道了类是哪个,但有时候也不容易知道被调用的方法在哪个文件,因为它可能是父类的,一些框架的继承体系链又比较长而复杂,不容易看出来所调用的方法在哪里。
办法就是在反射类的基础上 getMethod('方法名')
取得方法对象后,调用这个对象的getFilename()
取出来即可:
class AAA{
public function bbb(){
echo 'bbb';
}
}
$aaa = new AAA();
print_r([
//传递object实例变量给 ReflectionClass 进行实例化,取得文件路径
'实例aaa它的类所在的路径' => (new \ReflectionClass(实例变量或类名->getMethod('方法名')->getFilename(),
//'实例aaa它的类所在的路径' => (new \ReflectionClass($aaa))->getMethod('bbb')->getFilename(),
]);