有没有办法在PHP中输出函数的定义?

时间:2009-11-23 05:59:32

标签: php

function func() {
    // ...
}

我有函数名"func",但不是它的定义。

在JavaScript中,我只是使用alert()来查看定义。

PHP中是否有类似的功能?

2 个答案:

答案 0 :(得分:9)

您可以使用ReflectionFunctionAbstract中定义的getFileName(),getStartLine(),getEndLine()方法从源文件中读取函数/方法的源代码(如果有的话)。

e.g。 (没有错误处理)

<?php
printFunction(array('Foo','bar'));
printFunction('bar');


class Foo {
  public function bar() {
    echo '...';
  }
}

function bar($x, $y, $z) {
  //
  //
  //
  echo 'hallo';

  //
  //
  //
}
//


function printFunction($func) {
  if ( is_array($func) ) {
    $rf = is_object($func[0]) ? new ReflectionObject($func[0]) : new ReflectionClass($func[0]);
    $rf = $rf->getMethod($func[1]);
  }
  else {
    $rf = new ReflectionFunction($func);
  }
  printf("%s %d-%d\n", $rf->getFileName(), $rf->getStartLine(), $rf->getEndLine());
  $c = file($rf->getFileName());
  for ($i=$rf->getStartLine(); $i<=$rf->getEndLine(); $i++) {
    printf('%04d %s', $i, $c[$i-1]);
  }
}

答案 1 :(得分:0)

我不知道。请参见底部的代码。有一个function to list all the defined functions。另有get the values of all the arguments to the current functionnumber of arguments。还有一个see if a function exists。但似乎没有一个人可以命名当前的函数,也没有任何列出正式参数的方法。

即使发生运行时错误,它也不会列出调用堆栈,也不会声明激活的函数:

PHP Warning:  Division by zero in t.php on line 6

编辑:要识别代码的代码,请添加:

echo "At line " .__LINE__ ." of file " . __FILE__ ."\n";

它给出输出

At line 7 of file /home/wally/t.php

编辑2:我在我的代码中发现了这个函数,它看起来像你想要的那样:

function traceback ($showvars)
{
        $s = "";
        foreach (debug_backtrace($showvars) as $row)
        {
                $s .= "$row[file]#$row[line]: ";
                if(isset($row['class']))
                        $s .= "$row[class]$row[type]$row[function]";
                else    $s .= "$row[function]";
                if (isset($row['args']))
                        $s .= "('" . join("', '",$row['args']) . "')";
                $s .= "<br>\n";
        }
        return $s;
}

例如,它产生:

[wally@zf ~]$ php -f t.php
/home/wally/t.php#24: traceback('1')<br>
/home/wally/t.php#29: t('1', '2', '3')<br>
/home/wally/t.php#30: x('2', '1')<br>
/home/wally/t.php#31: y('2', '1')<br>
/home/wally/t.php#33: z('1', '2')<br>