LoginSignup
8
3

More than 3 years have passed since last update.

PhpStorm で @internal アノテーションを活用する方法

Posted at

PHP には現在、クラスの利用をパッケージプライベートアクセスに制限する方法がありません。他人に直接使われたくない内部用クラスを切り出すのを躊躇してしまいます。

Doc コメントでクラスに @internal アノテーションを付けると、むやみに外から使わないでほしい意図を表明はできます。が、これだけでは気休めにしかなりません。

<?php
namespace App\Module1;

/**
 * @internal
 */
class InternalClass
{
}

PhpStorm でこのアノテーションをじっさいに活かす方法を紹介します。

PhpStorm は @internal を名前空間ローカルではなく、パッケージ全体のローカルな内部クラスとして扱います。ここでいうパッケージというのは、vendor のサブフォルダに入るディレクトリ粒度のイメージです。

プロジェクトの src 内にある「別のパッケージのように扱いたい横並びのディレクトリ」を、それぞれ再度、Source Root と定義すると、そこから下が独立したパッケージのように認識されます。

image.png

Module1 と Module2 を異なるパッケージとすると、Preferences の Directories はこうなります。

image.png

同一パッケージ内でならなんの警告もなく利用できます。

image.png

しかし、異なるパッケージからの InternalClass の名指しは警告になります。

image.png

image.png

独立したライブラリのようなきれいに切り出した部分にそれぞれ Source Root 定義をしておけば、うっかり内部利用専用のクラスを使ってしまうミスに気づくのに役立ちます。

という警告のサポートがあるとはいえ、コード補完にはサジェストされるし、プロジェクトツリーでは他のクラスと同じアイコンに見えるので、いざ書いてみるまではダメが出るかわかりません。

他人の理解を促す (外からどのクラスを使ったらいいのか初見でわかるなど) には向いていないかもしれませんが、自分が @internal を付けて表明するべきかどうかを考える習慣づけにはなると思います。

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3