【PHP】クラスファイルにおける名前空間の記述ルール

クラスファイルにおける名前空間の記述ルール

PHPでクラスに名前空間を指定した場合のクラスファイル同士の関係や記述ルールをまとめます。

環境: PHP 7.4.4

名前空間とは

それを分けることでクラスファイルや関数に同じ名前を付けて作成出来る仕組みの事。

「名前空間 A」 の Hoge.php
「名前空間 B」 の Hoge.php

上記のように切り分ける事で名前の重複が可能になります。

また、名前空間はクラスにおいてオートロードの仕組みを導入する際に必要となり、威力を発揮します。
(オートロードについては以下の記事で紹介)

【PHP】Composerを使用してクラスのオートロードを行う

同じ名前空間に属するクラスを使用する

クラスから同じ名前空間に属する他のクラスを利用する場合、名前空間の指定なしで利用出来る。

(例)名前空間 app\modelが指定されたDogクラスから同じ名前空間のCatクラスを利用している。

<?php

namespace app\model;

class Dog 
{        
    public function barkingCat()
    {
        print "bow!";

        $cat = new Cat();
        $cat -> bark();
    }
}
<?php

namespace app\model;

class Cat 
{        
    public function bark()
    {
        print "meow!";
    }
}

他の名前空間に属するクラスを使用する場合

名前空間が定義されたクラスから他の名前空間に属するクラスを使用する場合、
使用するクラス名を完全修飾名で記述する必要がある。

(例)名前空間 app\model\personが指定されたOwnerクラスから他の名前空間app\model\animalに属するDogクラスを利用する

名前空間の先頭に\(バックスラッシュ)を付けて完全修飾名としている

<?php

namespace app\model\person;

class Owner 
{        
    public function callDog()
    {        
        $dog = new \app\model\animal\Dog();
        $dog -> bark();
    }
}
<?php

namespace app\model\animal;

class Dog 
{        
    public function bark()
    {
        print "bow!";
    }
}

use文を利用する

利用するクラスの名前空間は以下のようにuse文であらかじめ記述しておくことが出来る。
(先頭の\は合っても無くてもどちらもでもOK)

<?php

namespace app\model\person;
use app\model\animal\Dog;

class Owner 
{        
    public function callDog()
    {                
        $dog = new Dog();
        $dog -> bark();
    }
}

名前空間に属さないクラスを使用する場合

名前空間が定義されたクラスから
名前空間を指定していない(いずれの名前空間にも属さない)クラスを使用する場合、
使用するクラス名の先頭に\(バックスラッシュ)を記述する。

(例)名前空間app\model\personが指定されたOwnerクラスから、名前空間に属さないDogクラスを利用する。

<?php

namespace app\model\person;

class Owner 
{        
    public function callDog()
    {                
        $dog = new \Dog();
        $dog -> bark();
    }
}
<?php

class Dog 
{        
    public function bark()
    {
        print "bow!";
    }
}

PHPの標準クラスを利用する

PHPにあらかじめ用意されているクラス、
(例えばデータベースアクセスのPDOクラスなど)はグローバル空間という場所に所属するため
名前空間に属するクラスから使用する場合は、こちらも先頭に\(バックスラッシュ)を記述する必要がある。

<?php

namespace app\model;

class DataSource 
{    
    public static $pdo;

    public static function getPdoInstance()
    {        
        if(!is_null(self::$pdo))
        {
            return self::$pdo;
        }
        try {
            self::$pdo = new \PDO(DSN, user, pass);
            self::$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
            return self::$pdo;
        } catch (\PDOException $e) {
            echo 'Connection failed: ' . $e->getMessage();
            exit;
        }
    }
}

名前空間が定義されていないクラスから名前空間に属するクラスを使用する

いずれの名前空間にも属さないクラスから名前空間に属するクラスを使用する場合は
クラスの記述は完全修飾名でなくても良い。

(例)名前空間に属さないOwnerクラスから、名前空間app\model\animalに属するDogクラスを使用する。

\(バックスラッシュ)は不要 (書いても良い)

<?php

class Owner 
{        
    public function callDog()
    {                
        $dog = new app\model\animal\Dog();
        $dog -> bark();
    }
}
<?php

namespace app\model\animal;

class Dog 
{        
    public function bark()
    {
        print "b bow!";
    }
}

Follow me!