クラスを分類できるネームスペース(名前空間) – namespace

クラスの数が増えてくると整理がしにくくなったり、また複数の外部ファイルを読み込んだりすると、クラス名が重複したりする事があります。

これを防ぐために、クラスはネームスペース(名前空間)に分類して管理することができます。例えば次のようなファイルを準備しましょう。

/* bookstore/book.php */
namespace Store\Book;

// 書籍
class Book {
  private int $price;
}

もう1つ、次のファイルを準備します。

/* member.php */
namespace Member;

// メンバー
class Member {
  private string $name;
}

ここでは、Bookと Memberという2つのクラスを定義していますが、このそれぞれはまったく別の機能で利用するためのクラスです。そのため、ネームスペースをそれぞれ分けて管理しています。

ネームスペース内のクラスを利用する

ネームスペースに分けたクラスを利用する場合は、宣言の時の記述が次のように変わります。

<?php
require_once 'store/book.php';

$book = new Store\Book();

このように、バックスラッシュ区切りでネームスペースを指定します。

ネームスペースをあらかじめ定義する – use

ネームスペースを毎回指定するのが面倒な場合は、あらかじめ「use」で宣言しておくことで、省略することができます。

<?php
require_once 'store/book.php';

use Store\Book;

$book = new Book();

同じ名前のクラスに別名を付加する – as

複数のネームスペースの中に、同じクラス名があった場合、そのままでは正しく扱えません。例えば、先のmember.phpの中に、「Book」というクラスを定義してみましょう。

/* Review/Book */
namespace Review\Book;

class Book {
  private int $star;
}

この場合、次のように参照すると同じクラス名なのでエラーになります。

require_once 'store/book.php';
require_once 'review/book.php';

use Store\Book;
use Review\Book;

そこで、この場合に「as」というキーワードでそれぞれに別名を付加すると利用できるようになります。

require_once 'store/book.php';
require_once 'review/book.php';

use Store\Book as BookStore;
use Review\Book as BookReview;

$bookStore = new BookStore();
$bookReview = new BookReview();