名前空間とuseの実務
useは、名前空間つきのフルネームに短い別名を与える宣言で、ファイルを読み込む命令ではありません。実際の読み込みはオートローダーが担い、useは名前解決を助けます。
useは「別名を宣言している」だけ
名前空間そのものは分かっていても、use 文の挙動でつまずくことは意外と多いですね。use は何かを読み込んでいるように見えて、実際は「この短い名前を、あのフルネームの別名とみなす」という宣言に過ぎません。ファイルを include しているわけではない、というのが最初のポイントだと思います。
namespace App\Service;
use App\Repository\UserRepository;
final class UserService
{
public function __construct(private UserRepository $repo) {}
// UserRepository は App\Repository\UserRepository の別名として使える
}
読み込み自体はオートローダーが担っていて、use はあくまで名前の解決を助けるものです。ここを分けて理解しておくと、後述のエイリアスや関数の use も素直に飲み込めます。
asで衝突を避ける
実務でよくあるのが、同じクラス名が別の名前空間に存在してぶつかるケースですね。片方を as でリネームすると衝突を回避できます。ログのように似た名前が乱立しがちなものは、意識的に別名を付けておくと読み手も混乱しにくいと思います。
use App\Log\Logger as AppLogger;
use Psr\Log\LoggerInterface as PsrLogger;
function boot(AppLogger $a, PsrLogger $p): void
{
// 名前が衝突しない
}
関数と定数もuseできる
意外と知られていないのですが、use は function と const にも使えます。名前空間つきの関数を毎回フルパスで書くのは面倒なので、use function で取り込んでおくと呼び出しがすっきりしますね。ちなみに、名前空間内で組み込み関数を呼ぶと、まず現在の名前空間を探してからグローバルにフォールバックします。この探索を省いて最適化したいときにも use function は効きます。
namespace App\Util;
use function App\Helper\slugify;
use const App\Config\MAX_LEN;
$slug = slugify('Hello World');
$limit = MAX_LEN;
// 組み込み関数を明示的にグローバル参照
$len = \strlen($slug);
まとめ
use はファイルを読み込む命令ではなく、名前の別名を宣言しているだけ、という理解が出発点だと思います。衝突は as で回避、関数や定数も use できる、この二点を押さえておくと日々のコードがだいぶ書きやすくなりますね。実際の読み込みはオートローダー任せなので、次はそちらのPSR-4を整理しておくと全体像がつながる気がします。
よくある質問
Q. useはファイルを読み込んでいるのですか。
A. いいえ。useは短い名前をフルネームの別名とみなす宣言で、実際の読み込みはオートローダーが担います。
Q. 同じクラス名が衝突したときは。
A. as でリネームして回避します。use App\Log\Logger as AppLogger のように別名を付けます。
Q. 関数や定数もuseできますか。
A. できます。use function や use const で取り込むと、名前空間つきの関数や定数をフルパスなしで呼べます。