🚟

【PHP】グローバルの名前空間にあるクラスの取り扱い

2022/09/09に公開

概要

久しぶりに、最近PHP少し触ってみていています。
ふと気になったのは、例えば以下のコードにあるようなDateTimeで、なんでuse句書かなきゃいけないのかということです。

<?php

namespace App\Services\Sample;

use \Datetime;

class SampleService
{

    public function getNowDateTime()
    {
        return new DateTime('now');
    }
}

仕様等について簡単にですが調べたので、メモ書きします。

前提知識

まず前提として、PHPの名前空間に関する概要は、PHPの名前空間について簡単にまとめてみたを参照ください。DateTimeのように標準で用意されているクラスには、名前空間の設定がないグローバルの名前空間に属しているものがあります。

グローバルの名前空間の仕様について

PHPのドキュメントの名前空間の使用法: グローバル関数/定数への移行に、グローバルの名前空間の仕様が書いてあります。
クラスについてはクラス名は、常に現在の名前空間での名前として解釈されます。 したがって、内部クラスあるいは名前空間に属さないクラスにアクセスするには 次のように完全修飾名で指定しなければなりません。ということで、グローバルであっても完全修飾名での指定が必要です。逆に関数や定数は、関数や定数の場合、名前空間内にその関数や定数が見つからなければ PHP はグローバル関数/定数を探しますという仕様になっています。
グローバルの名前空間においては、クラスと関数/定数では動作が異なってくるんですねぇ。

Discussion