考虑以下两个文件:
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
,以便它会捕获此错误?还有其他工具可以捕获错误吗?
答案 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选项实际上运行脚本。)