【问题标题】:Where a php function is defined? [duplicate]php函数在哪里定义? [复制]
【发布时间】:2012-03-10 09:47:50
【问题描述】:

可能重复:
How to find out where a function is defined?

我想知道(以编程方式,可能通过反射 API)在哪里定义了某个 PHP 函数。

【问题讨论】:

  • 你所说的 where 是什么意思?你的意思是在哪个文件或哪个类或什么?
  • @Sarfraz 我正在寻找 file:line 但是你如何给出方法名称并找出具有这种方法的类?
  • @ashy_32bit:请使用请求的信息更新问题。通常,通过更新您的帖子而不是回复评论来回应澄清请求。一方面,一个问题应该是可以理解的,无需阅读 cmets。另一方面,SO 是一个 QA 和网站,而不是一个论坛,并且 cmets 不适合(也不适合)讨论。
  • @outis 这是我第一次阅读 Sarfraz 的评论时要做的第一件事,但后来我意识到问题很清楚,歧义来自所谓的评论,而不是问题本身(如您所见,有正确的答案)所以我决定发表评论并澄清一下。
  • @ashy_32bit:相反,Sarfraz 的评论是要求澄清。它不能引入歧义,因为它不添加任何信息。问题不清楚。当一个问题不清楚时,你仍然可能得到正确的答案,因为人们总是可以猜测或假设你的意思。但是,猜测和假设会导致错误。在技​​术问题上练习清晰的思维和沟通至关重要。

标签: php reflection


【解决方案1】:

ReflectionFunction 类中有一些看起来相关的内容(getFileNamegetStartLine 等)。

(未测试)

【讨论】:

    【解决方案2】:
    ReflectionMethod::getStartLine()
    ReflectionMethod::getFileName()
    ReflectionFunction::getStartLine()
    ReflectionFunction::getFileName()
    

    【讨论】:

      【解决方案3】:

      debug_backtrace() 将返回一个包含所有调用的数组,以及函数/方法的定义。反射类会给你函数的定义。

      例如我用它来记录旧项目中弃用的功能:

      function logDeprecated() {
          $trail = debug_backtrace();
          if ($trail[1]['type']) {
              $function = new ReflectionMethod($trail[1]['class'], $trail[1]['function']);
          } else {
              $function = new ReflectionFunction($trail[1]['function']);
          }
          $errorMsg = 'Function ' . $trail[1]['function'];
          if ($trail[1]['class']) {
              $errorMsg .= ' of class ' . $trail[1]['class'];
          }
          $errorMsg .= ' is deprecated (called from ' . $trail[1]['file'] . '#' . $trail[1]['line'] . ', defined in ' . $function->getFileName() . '#' . $function->getStartLine() . ')';
              return $errorMsg;
      }
      

      【讨论】:

      • 也许我没弄明白,但它实际上是否告诉您跟踪元素在哪里定义而不是被调用?
      • @ashy_32bit:你说得对,它并没有真正显示它的定义位置。我添加了一个示例,如何使用反射记录弃用的函数
      【解决方案4】:

      这可能不是最好的解决方案,但如果你找不到任何东西,如果你使用的是 linux,你可以使用grep 命令找到函数位置。

      exec('grep -irn "yourFunctionName" ./library', $response);
      foreach ($response as $file) {
          list($filename, $line) = explode(":", $file);
      }
      

      【讨论】:

        猜你喜欢
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-25
        • 2018-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多