phpmd controversial警告の解説

controversial

This ruleset contains a collection of controversial rules.

意見の別れるルール集。

キャメルケース警告は、クラス名、メンバー変数名、メソッド名、引数名、ローカル変数名の第5弾まであります。

議論に巻き込まれないようにしましょう。

キャメルケースって単語が4つも並ぶと単語の区切りがわかりにくいよね

そう思わない人もいるから、意見が別れるのよ。

Superglobals

メッセージ例

xx accesses the super-global variable yy.
Code language: plaintext (plaintext)

抑止方法

/** * * @SuppressWarnings(PHPMD.Superglobals) */
Code language: PHP (php)

説明

Accessing a super-global variable directly is considered a bad practice.
These variables should be encapsulated in objects that are provided by a framework, for instance.


スーパーグローバル変数($_GET、$_POSTなど)に直接アクセスすることは、バッドプロクティス。
(フレームワークがスーパーグローバル変数をカプセル化しているように)スーパーグローバル変数はカプセル化したほうがいいよ。

コード例

class Foo { public function bar() { $name = $_POST['foo']; } }
Code language: PHP (php)

解説

PHPが用意してくれるスーパーグローバル変数も「グローバル変数」。グローバル変数に依存しないように、ということでしょうか。

$_POSTなどに直接アクセスしていると、テストケースを作るとき、少しだけ面倒です。

テストケースでは、$_POST['foo']に値を設定して、bar()メソッドを呼び出します。他のテストケースに影響がないように、$_POST['foo']を元の状態に戻さなければなりません。

class FooTest extends TestCase { private postvarsBackup(); /** * @before */ public function setUp() { $this>postvarsBackup = $_POST; } /** * @after */ public function tearDown() { $_POST = $this>postvarsBackup } /** * @test */ public function bar() { $_POST['foo'] = 'test value'; $this->bar(); } }
Code language: PHP (php)

そこで、メソッドの引数(またはコンスタクタで)で$_POSTを渡すようにします。テストケースでは$_POSTではなく、ローカル変数$varsに必要なデータを設定することで、barメソッドを呼び出せるようになりました。

class Foo { public function bar($postVars) { $name = $postVars['foo']; } } class FooTest extends TestCase { /** * @test */ public function bar() { $vars = [ 'foo' => 'test value'; ]; $this->bar($vars); } }
Code language: PHP (php)

PHPのキーバリュー型配列は、キーがないとUndefined Index Noticeが発生します。そのため、isset()やarray_key_exists()でキーの存在確認が必要で、コードが煩雑になりがちです。

1行だけなら気になりませんが、このような行が10行も20行も並んでいるのを見たことがありますよね。

class Foo { public function bar() { $name = isset($_POST['foo']) ? $_POST['foo'] : ''; } }
Code language: PHP (php)

そこで、$_POSTをくるむMyMapクラスを用意して、MyMapを介してアクセスするようにします。

class MyMap { public function get($key, $defaultValue = '') { } public function exists($key) { } public function set($key, $value) { } } class Foo { public function bar($myMapPost) { $name = $this->myMapPost->get('foo'); } } $foo->bar(new MyMap($_POST));
Code language: PHP (php)

しかし、このMyMapクラス、undefined index防止しか付加価値を追加していません。それだけのために、existsメソッドやsetメソッドを用意したり、MyMapクラスに依存関係ができてしまうのは、ちょっとムダな感じがします。

$_POSTをくるむクラスを作るなら、汎用的なクラスではなく、そのページごとに固有の入力パラメータを集約した、例えばMyFormInputParamsクラスを作っておき、その後のissetチェックを不要にしたほうがいいかもしれません。

また、undefined index防止だけなら、ヘルパー関数を用意するだけでもいいでしょう。

class ArrayHelper { public static function get($vars, $key, $defaultValue = '') { return isset($vars[$key]) ? $vars[$key] : $defaultValue; } } class Foo { public function bar($postVars) { $name = ArrayHelper::get($postVars, 'foo'); } } $foo->bar(new MyMap($_POST));
Code language: PHP (php)

面倒だから、直接$_POSTアクセスしちゃおうっと😜

リファクタ例

CamelCaseClassName

メッセージ例

The class xx is not named in CamelCase.
Code language: plaintext (plaintext)

抑止方法

/** * * @SuppressWarnings(PHPMD.CamelCaseClassName) */
Code language: PHP (php)

説明

It is considered best practice to use the CamelCase notation to name classes.

クラス名がパスカルケースになっていないよ(1文字目が大文字のキャメルケース)

解説

キャメルケース警告の第1弾。

CamelCasePropertyName

メッセージ例

The property xx is not named in camelCase.
Code language: plaintext (plaintext)

抑止方法

/** * * @SuppressWarnings(PHPMD.CamelCasePropertyName) */
Code language: PHP (php)

説明

It is considered best practice to use the camelCase notation to name attributes.

メンバー変数がキャメルケースになっていないよ(1文字目は小文字)

解説

キャメルケース警告の第2弾

CamelCaseMethodName

メッセージ例

The method xx is not named in camelCase.
Code language: plaintext (plaintext)

抑止方法

/** * * @SuppressWarnings(PHPMD.CamelCaseMethodName) */
Code language: PHP (php)

説明

It is considered best practice to use the camelCase notation to name methods.

メソッド名がキャメルケースになっていないよ(1文字目は小文字)

解説

キャメルケース警告の第3弾

CamelCaseParameterName

メッセージ例

The parameter xx is not named in camelCase.
Code language: plaintext (plaintext)

抑止方法

/** * * @SuppressWarnings(PHPMD.CamelCaseParameterName) */
Code language: PHP (php)

説明

It is considered best practice to use the camelCase notation to name parameters.

引数名がキャメルケースになっていないよ(1文字目は小文字)

解説

キャメルケース警告の第4弾

CamelCaseVariableName

メッセージ例

The variable xx is not named in camelCase.
Code language: plaintext (plaintext)

抑止方法

/** * * @SuppressWarnings(PHPMD.CamelCaseVariableName) */
Code language: PHP (php)

説明

It is considered best practice to use the camelCase notation to name variables.

ローカル変数名がキャメルケースになっていないよ(1文字目は小文字)

解説

キャメルケース警告の第5弾

タイトルとURLをコピーしました