找出哪个类调用另一个类中的方法

php
2022-08-30 15:02:26

在PHP中,有没有办法找出另一个对象中什么对象叫什么方法。

示例:

class Foo
{
  public function __construct()
  {
    $bar = new Bar();
    $bar->test();
  }
}

class Bar
{
  public function test()
  {
  }
}
$foo = new Foo();

有没有办法让我发现测试方法是从foo对象调用的?


答案 1

你可以使用debug_backtrace,有点像这样:
顺便说一句,看看手册页面上的评论:有一些有用的功能和建议;-)

class Foo
{
  public function __construct()
  {
    $bar = new Bar();
    $bar->test();
  }
}

class Bar
{
  public function test()
  {
      $trace = debug_backtrace();
      if (isset($trace[1])) {
          // $trace[0] is ourself
          // $trace[1] is our caller
          // and so on...
          var_dump($trace[1]);

          echo "called by {$trace[1]['class']} :: {$trace[1]['function']}";

      }
  }
}
$foo = new Foo();

将输出:var_dump

array
  'file' => string '/home/squale/developpement/tests/temp/temp.php' (length=46)
  'line' => int 29
  'function' => string '__construct' (length=11)
  'class' => string 'Foo' (length=3)
  'object' => 
    object(Foo)[1]
  'type' => string '->' (length=2)
  'args' => 
    array
      empty

和 :echo

called by Foo :: __construct

但是,尽管它看起来不错,但我不确定它是否应该在您的应用程序中用作“正常的东西”......实际上似乎很奇怪:在我看来,有了一个好的设计,一种方法就不需要知道它叫什么。


答案 2

这是一个衬垫解决方案

list(, $caller) = debug_backtrace(false, 2);

从 PHP7 开始,根据文档,这将不起作用:http://php.net/manual/en/function.list.php 因为我们不能有空属性,这里有一个小更新:

list($childClass, $caller) = debug_backtrace(false, 2);

推荐