名前空間で衝突回避

名前空間

開発は一人で行うことは少ないですし、一人で全て開発するとしてもクラスなどの数が多くなってくると同じ名前になってしまう恐れがあります。回避するために名前を長くなって無駄に冗長化してしまいます。そこで名前空間を利用します。Javaではパッケージにあたります。

名前空間を定義する

名前空間の定義は以下のようにします。

namespace 名前空間名;

名前空間は¥(逆スラッシュ)で区切ることで階層構造にできます。例えば”a¥project”のクラスと”b¥project”のクラスの名前が同じでも別のクラスと認識されます。

名前空間を定義してコードを記述してみましょう。名前空間は必ず<?phpの次の行で定義してください。改行等もあってはだめです。

<?php
namespace a\b;

class Sample(){
  public function showName(){
    print "名前空間:". __NAMESPACE__;
  }

}

名前空間が設定されたクラスをインスタンス化して実行してみます。

<html>
<head>
<meta charset="utf-8">
<title>名前空間</title>
</head>
<body>
<?php
require_once "Sample.php";

$obj = new a\b\Sample();
$obj->showName();
?>
</body>
</html>

すると名前空間:a\bと表示されましたね。このように名前空間を定義しておくと、クラスの名前がかぶってしまってもそれぞれを識別して実行されるようになります。

インポートで長い名前は省略

名前空間で名前の衝突は防ぐことはできますが、クラスを呼びだすためにspace\doc\project\class\Sampleといったような長い名前を記述するのはめんどくさいです。実際はそれぞれもっと長い名前になることだってあります。
そんなとき、インポートすることによって記述を1回だけにすることができます。

use命令でインポートする

初めに、この名前空間のこのクラスを使いますよーと記述しておけば楽できます。実際に記述して見てみましょう。

<?php
namespace project\module\hogehoge;

class Sample(){
  public function showName(){
    print "名前空間:". __NAMESPACE__;
  }

}
<html>
<head>
<meta charset="utf-8">
<title>名前空間</title>
</head>
<body>
<?php
use project\module\hogehoge\Sample;
require_once "Sample.php";

$obj = new Sample();
$obj->showName();
?>
</body>
</html>

newするたびに名前空間を書くのはめんどくさいですが、これなら楽ちんですね。

コメント

タイトルとURLをコピーしました