<?php namespace first\aaaa\bbbb\cccc\dddd; function info(){ echo '私はFoo_1っす<br>';
<?php namespace first\aaaa\bbbb\cccc\dddd; require "Foo_1.php"; require "Foo_2.php"; info(); //私はFoo_1っす
Foo_1.phpに定義されたinfo()関数をFoo_3.phpで呼び出したい。その時に(Foo_3.phpにFoo_1.phpを読み込んで)
Foo_1.phpもFoo_3.phpも名前空間名が同じ
first\aaaa\bbbb\cccc\dddd;
だからFoo_3.phpでは単に
info();
とすれば呼び出せる。\(バックスラッシュ)を使用しない指定方法、これが非修飾形式。
<?php namespace first\aaaa\bbbb\cccc\dddd; function info(){ echo '私はFoo_1っす<br>'; }
<?php namespace first\aaaa; require "Foo_1.php"; require "Foo_2.php"; bbbb\cccc\dddd\info(); //私はFoo_1っす
これが修飾形式の指定方法。Foo_3.phpの名前空間の下の階層(bbbb)から指定すればよい、と。先頭に\(バックスラッシュ)が無く、途中にに\(バックスラッシュ)がある指定方法、これが修飾形式。
<?php namespace first\aaaa\bbbb\cccc\dddd; function info(){ echo '私はFoo_1っす<br>'; }
<?php namespace second; function info(){ echo '私はFoo_2っす<br>'; }
<?php namespace first\aaaa; require "Foo_1.php"; require "Foo_2.php"; \second\info(); //私はFoo_2っす
読み込む側の名前空間と読み込まれる側の名前空間が全く関係ない(同じ名前空間名が存在しない)場合、修飾形式では名前空間を指定できない。そういう場合に使用するのが完全修飾形式の指定方法。
先頭に\(バックスラッシュ)を付けて、その後に全ての名前空間を指定する。これが完全修飾形式。
名前空間を使えば関数名・クラス名の管理の手間が少なくなります。その代わり関数やクラスを使うときに名前空間を正しく指定しないといけません。その手間を少なくするのが
- 名前空間のエイリアスを作る
- 名前空間のインポートをする
- 関数をインポートする
- クラスをインポートする
などです。全てuseを使います。
<?php namespace first\aaaa\bbbb\cccc\dddd; function info(){ echo '<br>私はFoo_1でやんす<br>名前空間の指定がめんどくさいっす'; }
<?php namespace pppp\qqqq; require "Foo_1.php"; require "Foo_2.php"; \first\aaaa\bbbb\cccc\dddd\info(); \first\aaaa\bbbb\cccc\dddd\info(); \first\aaaa\bbbb\cccc\dddd\info(); \first\aaaa\bbbb\cccc\dddd\info();
↑関数を呼び出すたびに名前空間の指定が必要↑
<?php namespace first\aaaa\bbbb\cccc\dddd; function info(){ echo '<br>私はFoo_1でやんす<br>関数のインポートで楽をするっす'; }
<?php namespace pppp\qqqq; use function first\aaaa\bbbb\cccc\dddd\info; require "Foo_1.php"; require "Foo_2.php"; info(); info(); info(); info(); //私はFoo_1でやんす //関数のインポートで楽をするっす //私はFoo_1でやんす //関数のインポートで楽をするっす //私はFoo_1でやんす //関数のインポートで楽をするっす //私はFoo_1でやんす //関数のインポートで楽をするっす
上記が関数のインポート方法。use function に続けて「完全修飾形式の名前空間指定+関数名」。ただしuseを使う場合、完全修飾形式ですが先頭の\(バックスラッシュ)は付けない。
これで最初にuseで関数をインポートすれば、あとは名前空間を気にせずに普通に関数の呼び出しをすればよくなりますね。