2016-06-21 4 views
1

Рассмотрим следующие два файла:PHP Режим Lint не улавливает Несовместимые декларации ошибки

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 поймать его? Это ошибка, которая может быть обнаружена при «компиляции» (хотя php не является скомпилированным языком). Кажется, что php -l может заметить, что декларации несовместимы. Есть ли способ запустить php -l так, что он поймает эту ошибку? Есть ли другой инструмент, который поймает ошибку?

ответ

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 Docs - Command line options:

-l --syntax-чек
Обеспечивает удобный способ выполнения только проверки синтаксиса для данного PHP-кода. При успешном выполнении текст Синтаксические ошибки, обнаруженные в тексте, не записываются в стандартный вывод, а код возврата оболочки равен 0. При сбое текст Анализ ошибок в дополнение к сообщению об ошибке внутреннего синтаксического анализа записывается в стандартный вывод и устанавливается код возврата оболочки до -1.

Эта опция не находит фатальных ошибок (например, неопределенные функции). Используйте -f для проверки фатальных ошибок тоже.

(Обратите внимание, что опция -f фактически запускает скрипт.)

+0

Хорошее наблюдение, что он будет ловить ошибки в одном файле. К сожалению, это плохо масштабируется. Этот пример немного надуман - мне очень интересно делать это для более крупных проектов. – mkasberg

+1

Да, это было просто, чтобы продемонстрировать, как работает 'php -l'. См. Http://stackoverflow.com/questions/378959/is-there-a-static-code-analyzer-like-lint-for-php-files – ShiraNai7

+0

Phan выглядит интересно. Возможно, я начну использовать это после перехода на PHP 7. – mkasberg

Смежные вопросы