PhpClean
2023.12.17
PhpStorm和Intellij Idea的靜態代碼分析。
打開IDE轉到Settings->Plugins->Marketplace搜索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
}可以在PHPDOC塊中省略PHP中指定的類型
/**
* @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 使用斷言檢查變量類型而不是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 ){}
}在方法fromName中調用refactor this方法名稱和此類的所有新語句
new Text ( ' User ' ) // old code
Text:: fromName ( ' User ' ) // new code