【初心者向け】PHPの名前空間まとめ 〜namespaceの使用方法・useを用いたエイリアスについて・サブ名前空間〜
2019.08.28
大型のアプリケーション開発に携わると、名前空間という機能が頻繁に利用されます。
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を用いると、名前空間のエイリアスを作成できる
初心者の方が、少しでも知識を深めてくれれば幸いです。