PHP Lint模式不会捕获不兼容的声明错误

时间:2016-06-21 22:33:03

标签: php

考虑以下两个文件:

ParentClass.php

<?php

abstract class ParentClass
{
    abstract public function foo(array $arg1, array $arg2);
}

ChildClass.php

<?php

require_once "ParentClass.php";

class ChildClass extends ParentClass
{
    public function foo(array $arg1)
    {
        print_r($arg1);
    }
}

现在,让我们尝试一下这些文件:

$ php -l ParentClass.php 
No syntax errors detected in ParentClass.php

$ php -l ChildClass.php
No syntax errors detected in ChildClass.php

很好,没有语法错误!

但是等等!有一个问题:

$ php ChildClass.php 
PHP Fatal error:  Declaration of ChildClass::foo(array $arg1) must be compatible 
with ParentClass::foo(array $arg1, array $arg2) in 
/home/mkasberg/php_syntax_check/ChildClass.php on line 5

那么,为什么没有php -l抓住它呢?这是一个可以在&#34;编译时捕获的错误&#34; (虽然php不是编译语言)。似乎php -l可能会注意到声明不兼容。有没有办法运行php -l,以便它会捕获此错误?还有其他工具可以捕获错误吗?

1 个答案:

答案 0 :(得分:1)

lint操作仅进行语法检查。它不运行代码,因此解析器对ParentClass没有任何了解。

但是,如果将两个类定义放在一个文件中,则会显示错误:

$ php -l test.php

Fatal error: Declaration of ChildClass::foo() must be compatible with ParentClass::foo(array $arg1, array $arg2) in test.php on line ..

Errors parsing test.php

来自PHP文档 - Command line options

  

-l --syntax-check
  提供一种方便的方法,只对给定的PHP代码执行语法检查。成功时,文本中没有检测到语法错误被写入标准输出,并且shell返回代码为0.失败时,除了内部解析器错误消息之外的文本错误解析被写入标准输出并且shell返回代码被设置到-1。

     

此选项不会发现致命错误(如未定义的函数)。使用-f来测试致命错误。

(注意-f选项实际上运行脚本。)