名前空間と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 で取り込むと、名前空間つきの関数や定数をフルパスなしで呼べます。

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です