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には出てきますので、ちょろっと脳内にとどめておくとよいでしょう。
この記事が気に入ったらサポートをしてみませんか?