Анализ статического кода для Phpstorm и Intellij Idea.
Откройте IDE Перейти к Settings->Plugins->Marketplace Search для PhpClean . Нажмите кнопку install .
- Инспекции
- действия
Обнаружает операторов назначения и сравнения в одном утверждении.
while ( false !== $ current = ldap_next_entry ( $ con , $ current )) {
// ^^^ Hard to read this statements
yield $ this -> getSingleEntry ( $ con , $ current );
}Классы с тем же именем в разных пространствах имен могут быть запутаны. (Отключено по умолчанию)
namespace App {
class User {}; // <- Class name collision with CliUser
}
namespace Cli {
class User {}; // <- Class name collision with AppUser
}Вы можете установить некоторые теги PHPDOC в вашем проекте.
Эта проверка обнаруживает использование глобальных переменных.
echo $ _GET [ ' name ' ]; // <-- Global variable usage Защищенные методы могут быть преобразованы в частные.
final class User {
protected function name () {} // <-- Method can be private
}Методы должны быть закрыты (метод или финал класса)
class User {
public function name (): string { // <-- Method should be final
return '' ;
}
}Защищенные методы делают наши занятия более открытыми. Напишите только частные или публичные методы.
Всегда указывайте тип параметра. Это хорошая практика.
class User {
public function withName ( $ name ) {} // <-- Missing parameter type
}Всегда указывайте тип результата функции.
function phrase () { // <-- Missing return type
return ' hi ' ;
}Проверьте, устанавливается ли родительское свойство.
class A {
/** @deprecated */
protected $ name ;
}
class B extends A {
protected $ name ; // <-- Warn about deprecation
} Занятия, помеченные @final Doc, не должны быть расширены
/**
* @final
*/
class User {};
class Admin extends User {}; // <- Prohibited extentions of @final class User. Свойства, которые не инициализированы в конструкторе, должны быть аннотированы как нулевые.
class User {
/** @var string */ // <-- Property is not annotated correctly. Add null type
private $ name ;
public function getName () { }
public function setName ( string $ name ) { }
}Защищенные свойства могут быть преобразованы в частные.
class User {
protected $ user ; // <-- Property can be private
} Типы, указанные в PHP, могут быть опущены в блоках PHPDOC
/**
* @return void // <-- Redundant PhpDoc tag
*/
function show ( string $ message ): void {}Обнаружение автоматического литья типа
class Hello {
public function randomize (): self { /* ... */ return $ this ; }
public function __toString () { return ' Hi ' ; }
}
echo ( new Hello ())-> randomize (); // <-- Deprecated __toString call Используйте Assert, чтобы проверить тип переменной вместо комментария DOC.
/** @var User $user */ // <-- Use assert to check variable type
assert ( $ user instanceof User); Замените new ClassName() выбранным названным конструктором.
class Text {
public function __construct ( string $ name ){ }
public static fromName (string $ n ){}
} Вызовать refactor this на название метода fromName , и все новые операторы с этим классом будут изменены
new Text ( ' User ' ) // old code
Text:: fromName ( ' User ' ) // new code