PHP - проверка статического типа a-la PhpStorm
Я являюсь сторонником строго типизированного языка, но я работаю над большим проектом PHP.
Я использую PhpStorm, и мне нравится дополнительный тип намека, который вы можете предоставить, с такими комментариями:
/** @var \Payments $payment */
/** @property \Payments $payment */
PhpStorm отлично, потому что он дает вам предупреждение, когда типы не совпадают.
Мне было интересно, возможно ли также, чтобы этот вид проверки также был статически, вне PhpStorm.
Некоторый тип прекомпилятора командной строки, который прошел бы через код, проверяя также эти дополнительные подсказки, чтобы показать некоторую ошибку, если обнаружено несоответствие.
Это что-то, что можно сделать с помощью phpcs?
Моя конечная цель - иметь автоматизированный инструмент, который предупреждает меня о несоответствиях типов.
Я даже подумывал о переходе на HHVM, чтобы иметь гораздо лучший тип намека. Но я не доверяю HHVM еще для запуска на производстве.
В идеале было бы здорово разработать HHVM для добавления дополнительных типов, но код не будет работать на движке Zend PHP, который я хочу продолжать производить.
Любая идея?
Спасибо.
Ответы
Ответ 1
Для анализа статического кода, особенно помогая при обнаружении ошибок типа, можно использовать такие инструменты, как
PHPCS aka PHP_CodeSniffer - это стандартная проверка кода, не очень полезная при обнаружении ошибок типа.
Ответ 2
Автоматическая проверка несоответствий типов
Phantm
Если вы хотите проверить свой код на несоответствие типов, вы можете использовать Phantm. Вы можете использовать это с Jenkins или использовать с svn hook post-commit.
С официального сайта
Phantm - это инструмент, написанный в Scala, который может использоваться для обнаружения потенциальных ошибок программирования внутри приложений PHP. Он будет работать для небольших изолированных script, а также полномасштабных приложений. фантом означает "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 official.