namespaceとuse

namespaceは「名前空間」という訳語が当てはめられてますね。
大雑把には「名前(主にクラス名)が衝突するのを防ぐためのもの」とされています。
namespaceという考え方はPHP固有のモノではなくて。
PHP以外では、C++、Java、C#なども、namespaceがあります。

端的には……おいちゃんが認識している限りでは「Logクラス」と「DBクラス」が割と双璧なような気がしているのですが
・時前で作る必要があるからLogクラスとDBクラスを作った
・フレームワークを使っている……と、フレームワークにもLogクラスとDBクラスがあってぶつかった
といった感じの事象を連想していただけるとわかりやすいかと。

ちょいと大きめなプロジェクトだと
・会社A と会社B とで作ったクラス名が衝突した
なんていうケースを体験することができる、かも、しれません。

PHPでの仕様は、 名前空間 を見ると一番正確なのですが、ここでは簡単にかいつまんで。

大まかには
・"namespace"で宣言して
・使う時に、useを使う「事もある」
といった感じです。
一端、大雑把に「試せる」コードを書いてみましょう。

まず、namespaceを宣言してから、クラス定義を書きます。ファイル名は「name.php」としておきましょう。

<?php
namespace Test; 

class Hoge
{
}

上述のクラスを使ってみます。まずは「うまくいかない」書き方から。

<?php

require_once('name.php');

$obj = new Hoge();
var_dump($obj);

これを動かすと「PHP Fatal error: Uncaught Error: Class 'Hoge' not found in ..........」とかいう感じで怒られるかと思います。
これは「Hogeってクラスはないですよ」って言われてます。
name.phpで書いたクラスは「Hogeクラス」ではなく「Test名前空間のHogeクラス」なので、「(どこの名前空間にも所属していない)Hogeクラス」は「ないよ~」って言われてしまいます。

こんな風に書くと、Hogeクラスのインスタンスを作る事ができます。

<?php

require_once('name.php');

$obj = new \Test\Hoge();
var_dump($obj);

これは、PHPのマニュアルだと「完全修飾名」と呼称されている書き方ですね。
「Hogeをnewするのが1回だけ」ならコレでもよいような気がするのですが。

Slimを含め、比較的多くの「最近のPHP」だと
・useを使ってエイリアス(別名)を宣言して
・エイリアス(別名)でnewする
という方法が、割とよく使われています。
実際にコードを書いてみましょう。

<?php

require_once('name.php');

use Test\Hoge as Hoge; // 別名の定義

$obj = new Hoge();
var_dump($obj);

このように書くと
・new Hogeの「Hoge」は、その上で「Test\Hogeだよ」って書かれているから「Test\Hoge」に置き換えて解釈する
ので、すんなりと通ります。

useは

use 完全修飾名 as 別名;

と記述します。
ただ、これ少しだけ省略が可能で。

use Test\Hoge as Hoge; // 別名の定義

の場合は

use Test\Hoge; // 別名の定義

とすることが出来ます。
「最後のクラス名をそのまま別名にするとき」ですね。
上述の書き方で、改めて「Hogeをnewする」コードを書いてみましょう。

<?php

require_once('name.php');

use Test\Hoge; // 別名の定義

$obj = new Hoge();
var_dump($obj);

どちらかというと、この「省略する書き方」のほうがポピュラーに見かけるのではないか、と思います。
この「useでエイリアスを切るとき」は、先頭のバックスラッシュは「不要」で、かつ「推奨されていない」点に注意しておきましょう。

また、PHP7では、use句を少しだけ、こんな風にまとめて書く事もできます。

use Test\{ClassA, ClassB, ClassC as C, ClassD};

沢山のuse句を書く時に、ちょっとだけキレイにまとめられるので、覚えておいてもよいかもしれません。

また、名前空間は、いわゆるディレクトリのように「ネストさせる」事も出来ます。
PHPのマニュアルだと「サブ名前空間」という書かれ方をされてますね。

namespace MyProject\Sub\Level;

という風にかけます。バックスラッシュが区切り文字になっています。
この「サブ名前空間」も、Slimには出てきますので、ちょろっと脳内にとどめておくとよいでしょう。

この記事が気に入ったらサポートをしてみませんか?