【初心者向け】PHPの名前空間まとめ 〜namespaceの使用方法・useを用いたエイリアスについて・サブ名前空間〜

大型のアプリケーション開発に携わると、名前空間という機能が頻繁に利用されます。

PHP5.3.0から実装された機能で、非常に便利なので是非覚えて活用していきましょう。

名前空間とは

名前空間はPHP5.3.0から実装された機能で、クラスや定数や関数の名前の衝突を防ぐためのものです。

例えば、下記のようなコードを実行すると、「Cannot declare class クラス名」というエラーが表示されます。


Hepler/Dog.php

<?php class Dog{ public function say(){ echo "wan-wan-\n"; } }

Model/Dog.php

<?php class Dog{ public function run(){ echo "inu ha hashiru\n"; } }

index.php

<?php include __DIR__ . '/Helper/Dog.php'; include __DIR__ . '/Model/Dog.php'; $dog = new Dog(); # 実行結果 Fatal error: Cannot declare class Dog, because the name is already in use in /Users/nakazawakan/Desktop/practice/Model/Dog.php on line 2

上記のエラーの内容を要約すると、「そのCatクラス名は既に宣言されているので使えないよ」というものです。

このように、PHPでは同じクラス名、定数名、関数名があるとエラーになってしまいますが、名前空間を用いると上記のエラーを防ぐことができます。

名前空間の記述方法

名前空間ではnamespaceを用いることで、クラス・関数・定数の衝突を防ぐことができます。

先ほどの記述を、namespaceを用いて記述すると、下記のようになります。


Hepler/Dog.php

<?php namespace Helper; class Dog{ public function say(){ echo "wan-wan-\n"; } }

Model/Dog.php

<?php namespace Model; class Dog{ public function run(){ echo "inu ha hashiru\n"; } }

index.php

<?php include __DIR__ . '/Helper/Dog.php'; include __DIR__ . '/Model/Dog.php'; $dogHepler = new \Helper\Dog(); $dogHepler->say(); $dogModle = new \Model\Dog(); $dogModle->run(); # 実行結果 wan-wan- inu ha hashiru

上記の中で注目すべき点は2つです。

  • namespaceは最初に記述する
  • クラスを呼び出す方法は名前空間名\クラス名と記述する

namespaceは記述する位置が重要で、namespaceの前にPHPの命令文やHTMLを記述するとエラーになります。

また、クラス名を呼び出す場合、名前空間名\クラス名(\Helper\Dog())と記述します。

サブ名前空間

ディレクトリ構造同様、名前空間に階層を持たせることができます。

下層ディレクトリをサブ名前空間と呼びます。


サブ名前空間

名前空間\サブ名前空間\サブ名前空間

サブ名前空間は特別気をつけることはなく、知識として覚えておきましょう。

名前空間のエイリアス

名前空間は useキーワードを用いるとエイリアスを作成することができます。

エイリアスとは、記述を短くしたり別名を作ることで、useを用いると名前空間の記述を短縮できるのです。

例えば下記のように、サブ名前空間が長い場合、何度も記述するのは面倒なので、エイリアスを作成することで後々の記述が楽になります。


Creature/Animal/Model/Dog.php

<?php namespace Creature\Animal\Model; class Dog{ public function run(){ echo "inu ha hashiru\n"; } }

index.php

<?php include __DIR__ . '/Creature/Animal/Model/Dog.php'; use \Creature\Animal\Model as type; $dogModel = new type\Dog(); $dogModel->run();

use \Creature\Animal\Model as type;の記述がエイリアスの作成部分です。

次の行の$dogModel = new type\Dog();は、エイリアスで作成されたtypeを用いてサブ名前関数を短縮しています。

名前空間まとめ

名前空間についてまとめると、次のようになります。

  • 名前空間は、クラスや定数や関数の名前の衝突を防ぐための機能
  • 名前空間は「namespace」と記述し、クラスは「名前関数/クラス名();」で呼び出す
  • サブ名前空間でディレクトリ階層と同様の役割ができる
  • useを用いると、名前空間のエイリアスを作成できる

初心者の方が、少しでも知識を深めてくれれば幸いです。

Related