如何检查php文件中未定义的函数?

如何检查php文件中未定义的函数?,php,Php,调用php-l检查php文件的语法 有没有办法检查未定义的函数我不需要它来处理运行时定义的函数,也不需要它处理动态调用 调用文件显然不起作用:我需要检查整个文件,而不仅仅是执行的分支。请参见下面的示例 myfile.php: function imhere () {} main.php: require_once 'myfile.php'; if (true) { imhere(); } else { imnhothere(); // I need to get a warn

调用
php-l
检查php文件的语法

有没有办法检查未定义的函数我不需要它来处理运行时定义的函数,也不需要它处理动态调用

调用文件显然不起作用:我需要检查整个文件,而不仅仅是执行的分支。请参见下面的示例

myfile.php:

function imhere () {}
main.php:

require_once 'myfile.php';

if (true) {
    imhere();
}
else {
    imnhothere(); // I need to get a warning about this
}

检查语法只需要扫描php文件的当前内容,但检查是否定义了函数是不同的,因为函数可以在所需的文件中定义

最简单的方法就是执行文件,undefined函数将给您一个
PHP致命错误:调用undefined函数….


或者您可能需要。

在动态语言中,不可能检查未定义的函数。考虑到未定义的函数可以以多种方式表现出来:

undefined();
array_filter('undefined', $array);
$prefix = 'un'; $f = $prefix.'defined'; $f();
除此之外,还有一些函数可以有条件地使用和定义(通过include或其他方式)。在最坏的情况下,考虑这种情况:

if(time() & 1) {
    function foo() {}
}

foo();

上面的程序调用了一个未定义的函数吗?

在评论之后,我想我会把一些想法总结成一个答案

看起来您可能需要的是一些更高级别的测试(集成或web测试)。通过这些,您可以测试完整的模块或整个应用程序,以及它们是如何结合在一起的。这将帮助您通过使用相关includes语句对整个页面或类组运行测试来隔离对未定义函数的调用以及许多其他内容。您可以使用PHPunit进行集成测试(以及单元测试),尽管我不确定这会给您带来多少好处

最好是调查web测试。您可以使用多种工具(这绝不是一个完整的列表):

  • 我相信这可以和PHPUnit联系起来
  • ,不确定这是否得到很好的维护,但我过去曾在简单的(!)测试中使用过它
  • ,这使用小黄瓜实现了BDD,但我知道它可以用来做web测试(

什么是“检查未定义的函数”?检查对未定义函数的调用?还有,“在运行时定义的函数”是什么意思?使用
function x(){…}定义的自定义函数
?-如中所述,在检查时仅包括内置PHP和扩展函数?@JaniHartikainen它当然应该递归检查包含的文件。我不确定,但您可以尝试使用
可调用的
。这将在运行时发出警告。@UdaySawant我在运行时不需要它,我需要从命令行解析文件,就像我会使用
php-l
好的,我已经发布了一个答案,因为有太多的信息供评论!…*如果*你碰巧找到了调用未定义函数的代码路径。当然它不会工作,因为我需要检查整个文件,而不仅仅是执行的部分…(@Jon)这就是为什么我明确地说我不需要像第一个例子那样检查特殊情况。第二个例子不应该给出任何警告,因为我还说它应该检查每个分支,不管怎样(添加了一个例子)@Lohoris您没有明确地说不要检查Jon的第一个示例。您明确地说不要检查在运行时定义的函数,而不是像Jon的示例中那样的动态函数调用。