PHP には現在、クラスの利用をパッケージプライベートアクセスに制限する方法がありません。他人に直接使われたくない内部用クラスを切り出すのを躊躇してしまいます。
Doc コメントでクラスに @internal
アノテーションを付けると、むやみに外から使わないでほしい意図を表明はできます。が、これだけでは気休めにしかなりません。
<?php
namespace App\Module1;
/**
* @internal
*/
class InternalClass
{
}
PhpStorm でこのアノテーションをじっさいに活かす方法を紹介します。
PhpStorm は @internal
を名前空間ローカルではなく、パッケージ全体のローカルな内部クラスとして扱います。ここでいうパッケージというのは、vendor のサブフォルダに入るディレクトリ粒度のイメージです。
プロジェクトの src 内にある「別のパッケージのように扱いたい横並びのディレクトリ」を、それぞれ再度、Source Root と定義すると、そこから下が独立したパッケージのように認識されます。
Module1 と Module2 を異なるパッケージとすると、Preferences の Directories はこうなります。
同一パッケージ内でならなんの警告もなく利用できます。
しかし、異なるパッケージからの InternalClass の名指しは警告になります。
独立したライブラリのようなきれいに切り出した部分にそれぞれ Source Root 定義をしておけば、うっかり内部利用専用のクラスを使ってしまうミスに気づくのに役立ちます。
という警告のサポートがあるとはいえ、コード補完にはサジェストされるし、プロジェクトツリーでは他のクラスと同じアイコンに見えるので、いざ書いてみるまではダメが出るかわかりません。
他人の理解を促す (外からどのクラスを使ったらいいのか初見でわかるなど) には向いていないかもしれませんが、自分が @internal
を付けて表明するべきかどうかを考える習慣づけにはなると思います。