PHP – проверка статического типа a-la PhpStorm

Я строго владею языком, но я работаю над большим проектом PHP.

Я использую PhpStorm, и мне нравится дополнительный тип намека, который вы можете предоставить, с такими комментариями:

/** @var \Payments $payment */ /** @property \Payments $payment */ 

PhpStorm отлично, потому что он дает вам предупреждение, когда типы не совпадают.

Мне было интересно, возможно ли также, чтобы этот вид проверки был статически, вне PhpStorm. Какой- то прекомпилятор командной строки, который будет проходить через код, проверяя также эти дополнительные подсказки, чтобы показать некоторую ошибку, если обнаружено несоответствие.

Это что-то, что можно сделать с помощью phpcs ?

Моя конечная цель – иметь автоматизированный инструмент, который будет предупреждать меня о несоответствиях типов.

Я даже подумывал о переходе на HHVM, чтобы иметь гораздо лучший тип намека. Но я не доверяю HHVM, но для запуска на производстве.

В идеале было бы здорово разработать HHVM для дополнительного типа намека, но код не будет работать на движке Zend PHP, который я хочу продолжать производить.

Есть идеи?

Благодарю.

Для анализа статического кода, в частности, помощи при обнаружении ошибок типов, можно использовать такие инструменты, как

PHPCS aka PHP_CodeSniffer – это стандартная проверка кода , которая не очень полезна при обнаружении ошибок типа.

Автоматическая проверка несоответствий типов

Phantm

Если вы хотите проверить свой код на несоответствия типов, вы можете использовать Phantm . Вы можете использовать это с Jenkins или использовать с svn hook post-commit .

С официального сайта

Phantm – это инструмент, написанный на Scala, который может использоваться для обнаружения возможных ошибок программирования внутри приложений PHP. Он будет работать как для небольшого изолированного сценария, так и для полномасштабных приложений. фантом означает «PHp ANalyzer для ошибок типа».

Требуется Phantm

 ant sbt Java 1.6 or higher Scala 2.9.1 or higher 

Применение

 $ ./phantm <target.php> 

PHPLint

Другим способом проверки вашего php-кода для несоответствий типов является PHPLint . Вы можете использовать его с Jenkins, svn или другими инструментами.

С официального сайта

PHPLint является валидатором и документатором для программ PHP 4 и PHP 5. PHPLint расширяет язык PHP через прозрачный метакод, который может заставить анализатор еще более строгую проверку источника. PHPLint – это не просто проверка : он реализует новый, строго типизированный язык, реализованный на языке PHP. Вы можете создавать свои программы с нуля с помощью PHPLint, или вы можете проверять и исправлять существующие программы, или вы можете следовать быстрому и грязному способу программирования PHP, а затем добавить мета-код PHPLint позже, как только программа будет закончена. Независимо от выбранной вами стратегии, PHPLint делает ваши программы более безопасными, более безопасными, хорошо документированными и с значительно меньшими ошибками. У PHPlint есть хороший инструмент онлайн-тестирования .

Дополнительная информация о работе с типами PHPLint

Применение

  $ phplint <target.php> 

Ручная проверка несоответствий типов

Если вы хотите проверить типы переменных с помощью PHPStorm, вы можете использовать метаданные PHPDoc . Но гораздо лучше использовать php для этого : вы можете включить E_NOTICE для отчета неинициализированных переменных для орфографических ошибок имени переменной catch. После этого вы можете использовать проверку экземпляра в своих функциях:

 /** * @param array $data - highlight for PHPStorm * @param MySuperClass $row - highlight for PHPStorm */ function(array $data, MySuperClass $row) { // Error if $data is not an array // Error if $row is not instance of MySuperClass /* do something .... */ } /** * @param array $data - highlight for PHPStorm * @param MySuperClass $row - highlight for PHPStorm */ function($data, $row) { if (!is_array($data)) { throw new TypeException('$data is must be array'); } if (!($row instanceof MySuperClass)) { throw new TypeException('$data is must be array'); } } 

Я думаю, что это лучший способ проверки типов, когда разработчик пишет правильный код с использованием метода TDD . Очень хорошее решение, которое вы можете прочитать в официальной документации php или у официального представителя PHPUnit .