参考
名前空間(namespace)
- ソースコードを名前の付いた空間に配置していくという考え方
- 分割したファイルで同じ関数名を宣言してしまうとエラーに現象を解消する
- 同一のファイルでクラスや関数の衝突を防ぐ
- 名前空間に保存できるのは関数、定数、クラスなど
- 1つのファイルには1つの名前空間にすることが推奨されている
書き方
namespace 名前空間名;
- ソースコードの1番上に記述
- クラス、インターフェイス、関数、定数が名前空間の影響を受ける
どんなエラーが起こる?
test01.php
//同じ関数名が2つ
<?php
function getName(){
return 'Samurai';
}
function getName(){
return ‘Engineer';
}
?>
test02.php
<?php
//phpファイルを読み込むが同じ関数を2つ読み込めないのでエラーとなる
require_once 'test01.php';
//関数の呼出し
echo getName();
?>
名前空間を指定した場合
test01.php
<?php
namespace name1;
function getName(){
return 'Samurai';
}
namespace name2;
function getName(){
return 'Engineer';
}
?>
test02.php
<?php
//phpファイルを読み込む
require_once 'test01.php';
//関数の呼出し
echo name1\getName();
echo name2\getName();
?>
→これで実行される!
test01.phpのname01とname02はそれぞれ区別されて配置されている。
※頭のバックスラッシュ(\)は省略できる。なので下記でも動く。
※頭のバックスラッシュはグローバル空間を表す
ネームスペースの指定が無い空間のこと
echo \name\getName();
呼び出し方法
名前空間\関数名
{}で指定する方法
- namespaceで指定した箇所を{}で囲う
- こちらの方がわかりやすい?
test01.php
<?php
namespace name1{
function getName(){
return 'Samurai';
}
}
namespace name2{
function getName(){
return 'Engineer';
}
}
?>
test02.php
呼び出しは同じ記述
<?php
//phpファイルを読み込む
require_once 'test01.php';
//関数の呼出し
echo name1\getName();
echo name2\getName();
?>
呼び出し方法について
非修飾形式
- 同ディレクトリ内からの指定のような形
- 同じ名前空間を定義。同じ名前空間にあるため、関数を呼ぶときは名前空間を記述しません。
- 同じ名前空間にあるため、 \ を含まない指定が非修飾形式
- \の有無がよくわからない…udemyでは\ありになっている
- →追記。udemyでありになっている箇所試したら無しでも動いた。
test01.php
- test01.php には tokyo\sato; という名前空間名を定義し、getGreeting() 関数を記述。
<?php
namespace tokyo\sato;
function getGreeting() {
return 'おはよう';
}
test02.php
- test02.php には test01.php と同じ名前空間を定義します。
同じ名前空間にあるため、関数を呼ぶときは名前空間を記述しません。
<?php
namespace tokyo\sato;
require_once 'test01.php';
echo getGreeting();
修飾形式
- ドキュメント相対パスのような形
- 上位階層にあるため、途中に \ を含めて階層も指定するのが修飾形式
test01.php
- test01.php には namespace tokyo\sato; という名前空間名を定義し、getGreeting() 関数を記述します。
<?php
namespace tokyo\sato;
function getGreeting() {
return 'おはよう';
}
test02.php
- test02.php には tokyo という名前空間を定義します。
ディレクトリ構造で言うと test01.php の名前空間より一つ上の階層に位置します。
一つ上の階層にあるため、関数を呼ぶときは echo sato\getGreeting(); と記述します。
<?php
namespace tokyo;
require_once 'test01.php';
echo sato\getGreeting();
完全修飾形式
- ディレクトリ構造で言うところのルート相対パス
- 最初に \ を記述して最上位階層から指定するのが完全修飾形式
test01.php
- test01.php には上記と同じく namespace tokyo\sato; という名前空間名を定義し、getGreeting() 関数を記述します。
<?php
namespace tokyo\sato;
function getGreeting() {
return 'おはよう';
}
test02.php
<?php
namespace tokyo;
require_once 'test01.php';
echo \tokyo\sato\getGreeting();
use
- useとは名前空間の拡張機能
- 外部のエイリアスやその一部を参照したり、クラス・関数・定数などをインポートするときに使用
例
index.php
<?php
require_once 'lib.php';
use function lib\with_tax;
$price = with_tax(1000, 0.08);
echo $price;
lib.php
<?php
namespace lib;
const TAX_RATE = 0.1;
function with_tax($base_price, $tax_rate = TAX_RATE) {
$sum_price = $base_price + ($base_price * $tax_rate);
$sum_price = round($sum_price);
return $sum_price;
}
-
use function lib\with_tax;
と記述。ここで名前空間を呼び出すことで、
後の記述は通常通りにできる -
$price = with_tax(1000, 0.08);
にはlib\
が不要ということ
useでの別名称定義
- 名前空間などのフルパスを短縮して、別の名称で定義することが可能
書き方
use [名前空間または一部・クラス・関数・定数など] as 別名称
使い方
test01.php
<?php
namespace asia\japan\tokyo\shibuya;
function getName(){
return 'shibuya';
}
namespace asia\japan\tokyo\minato;
function getName(){
return 'minato';
}
namespace asia\japan\tokyo\shinagawa;
function getName(){
return 'shinagawa';
}
?>
test02.php
<?php
//phpファイルを読み込む
require_once 'test01.php';
//名前空間をインポート
use asia\japan\tokyo as name;
//関数の呼出し
echo name\shibuya\getName();
echo '<br>';
echo name\minato\getName();
echo '<br>';
echo name\shinagawa\getName();
?>
実行
shibuya
minato
shinagawa
グルーバル空間について
- グローバル空間内に配置された関数や定数は他のどの空間からでも呼び出すことができる
- グローバル空間内に指定されたクラスに関してはバックスラッシュが必要