添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

获取类和函数的文件位置

平时进行调试工作时,有时候是需要知道 $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年经验以下新人所不熟悉的ReflectionClassReflectionFunction,这是一系列以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(),