はじめまして! 2022年7月に入社しました伊神 誠人と申します!
前職もWebマーケティングを行っている会社でその経験も活かしながら頑張って行きます! 配属はPHPチームで現在研修を受けています。
今回は「PHPの名前空間」についてご紹介したいと思います!
プログラム内においてクラスや関数などの名前が重複し衝突をしないようにするため名前空間を利用しグループ化する必要があります。 PHPのnamespaceやuseなどについて基本的なことから使い方まで紹介します。
- namespace(名前空間)とは?
- namespaceの使い方
- 名前の重複による衝突(エラー)例
- namespaceを利用した衝突(エラー)を回避する例
- useとは?
- useの使い方
- 名前空間のインポート(取り込み)例
- 名前空間のエイリアス(別名)をつける例
- 補足
- まとめ
namespace(名前空間)とは?
namespace(名前空間)とは、クラスや関数などをグループ化することをいいます。 通常は同じファイル内に同じ名前のクラスや関数を設定する事はできませんが、名前空間を使用することにって、同じ名前のクラス名や関数名を使用することができます。 なので外部のライブラリを利用してもnamespaceを利用することで衝突することを避けることができます。
namespaceの使い方
名前空間を定義する際は、「namespace 名前空間名;」とPHPファイルの一番先頭に記述します。
名前の重複による衝突(エラー)例
person.php:
<?php
function getName(){
return "山田太郎";
}
function getName(){
return "伊藤太郎";
}
?>
call.php
<?php
require_once 'person.php';
echo getName();
?>
実行結果
PHP Fatal error: Cannot redeclare getName() (previously declared in ...
関数getNameを再宣言できないよとエラーが発生します。
※PhpStormだと事前に検知してくれました。
namespaceを利用した衝突(エラー)を回避する例
person.php:
<?php
namespace namespace_1; //追加
function getName(){
return "山田太郎";
}
namespace namespace_2; //追加
function getName(){
return "伊藤太郎";
}
?>
call.php
<?php
require_once 'person.php';
echo namespace_1\getName();
echo "\n";
echo namespace_2\getName();
?>
実行結果
山田太郎
伊藤太郎
namespaceを利用することで関数名が同じでも呼び出すことができました。 今回は、namespace_1のgetName関数とnamespace_2のgetName関数でそれぞれグループ化しています。
useとは?
useを使用することで、名前空間のインポート(取り込み)、名前空間のエイリアス(別名)をつけて使用することができます。
useの使い方
名前空間のインポート(取り込み)例
nagoya.php
<?php
namespace asia\japan\aichi\nagoya;
class pref {
public function getPref() {
return "nagoya";
}
}
?>
call.php
<?php
require_once 'nagoya.php';
use asia\japan\aichi\nagoya\pref;
$sample = new pref;
echo $sample->getPref();
?>
call.phpに use asia\japan\aichi\nagoya\pref; と記述することで、prefクラスをインポートしています。
※useの箇所をuse functionにすることで関数、use constにすると定数もインポート可能です。
名前空間のエイリアス(別名)をつける例
nagoya.php
<?php
namespace asia\japan\aichi\nagoya;
class pref {
public function getPref() {
return "nagoya";
}
}
?>
call.php
<?php
require_once 'nagoya.php';
use asia\japan\aichi\nagoya\pref as name;
$sample = new name;
echo $sample->getPref();
?>
useでasia\japan\aichi\nagoya\prefをname(別名)にしています。 こうすることによってパスを短縮して同名のクラスや関数をかんたんに呼び出すことができます。
参考
https://www.php.net/manual/ja/language.namespaces.importing.php
まとめ
名前空間を定義するnamespaceについてや名前空間のインポートやエイリアスをつけるuseの基本的な情報から使い方を紹介しました。
プロジェクトが大きくなると名前の衝突が起きてしまうため名前をわざと長くしたりせず名前空間をうまく利用しながら活用していきたいですね。