Static Code Analysis for PhpStorm and Intellij Idea.
Open IDE go to Settings->Plugins->Marketplace
search for the PhpClean
.
Hit install
button.
Detects assignment and comparison operators in one statement.
while (false !== $current = ldap_next_entry($con, $current)) {
// ^^^ Hard to read this statements
yield $this->getSingleEntry($con, $current);
}
Classes with same name in different namespaces can be confused. (Disabled by default)
namespace App {
class User {}; // <- Class name collision with \Cli\User
}
namespace Cli {
class User {}; // <- Class name collision with \App\User
}
You can deprecate some PhpDoc tags in your project.
This inspection detects usages of global variables.
echo $_GET['name']; // <-- Global variable usage
Protected methods can be converted to private.
final class User {
protected function name() {} // <-- Method can be private
}
Methods should be closed (make method or class final)
class User {
public function name(): string { // <-- Method should be final
return '';
}
}
Protected methods make our classes more open. Write private or public methods only.
Always specify parameter type. This is a good practice.
class User {
public function withName($name) {} // <-- Missing parameter type
}
Always specify result type of the function.
function phrase() { // <-- Missing return type
return 'hi';
}
Check if parent property is deprecated.
class A {
/** @deprecated */
protected $name;
}
class B extends A {
protected $name; // <-- Warn about deprecation
}
Classes marked with @final
doc tag should not be extended
/**
* @final
*/
class User {};
class Admin extends User {}; // <- Prohibited extentions of @final class User.
Properties that are not initialized in the constructor should be annotated as nullable.
class User {
/** @var string */ // <-- Property is not annotated correctly. Add null type
private $name;
public function getName() { }
public function setName(string $name) { }
}
Protected properties can be converted to private.
class User {
protected $user; // <-- Property can be private
}
Types that are specified in the php can be omitted in the PhpDoc blocks
/**
* @return void // <-- Redundant PhpDoc tag
*/
function show(string $message): void {}
Detect automatic type casting
class Hello {
public function randomize(): self { /* ... */return $this; }
public function __toString() { return 'Hi'; }
}
echo (new Hello())->randomize(); // <-- Deprecated __toString call
Use assert to check variable type instead of doc comment.
/** @var User $user */ // <-- Use assert to check variable type
assert($user instanceof User);
Replace new ClassName()
with selected named constructor.
class Text {
public function __construct(string $name){ }
public static fromName(string $n){}
}
Invoke refactor this
on method name fromName
and all new statements with this class will be changed
new Text('User') // old code
Text::fromName('User') // new code