Я строго владею языком, но я работаю над большим проектом 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 .