こんにちは、穂苅と申します。
このコラムでは、私が PHP8 技術者認定初級試験のための公式問題集(PHP8 技術者認定初級試験公式問題集)で学習した内容やポイントを取り上げて解説をしていくものです。
P148~151 のChapter 15 名前空間、オートローダを学習してみました。
PHPの名前空間とは?
名前空間という言葉だけを見ると、一見何のことかよく分かりませんでした。そこでPHP のリファレンスの名前空間のページを見ながら理解してみました。
リファレンスの言葉を借りると、「名前空間」とは、項目をカプセル化するもののこと、と書いてあります。例えば、example.txt というファイルがある場合、/home/test の中にあるexample.txt ファイルと/home/other の中にあるexample.txt は同じファイル名ですが存在できます。しかし、同じディレクトリ上には同じファイル名のファイルは配置できません。この当たり前といえば当たり前の挙動を頭に入れると、名前空間が理解できるようになります。
それではクラス名や関数名を考えてみます。ファイル名の理屈と同様に、同じ名前のものは衝突してしまいますので使用することができません。しかし、そうなると2 つの問題が発生してしまいます。
1. エンジニアが作成したコードとPHP の組み込みのクラス・関数・定数、サードパーティのクラス・関数・定数の名前が衝突してしまう可能性がある
2. 1 を回避するためには、アンダースコアなどを利用して長い名前をつけていく必要があり、コードが分かりづらくなっていく
そこで、名前空間を使うことで関連するクラス・インターフェイス・関数・定数をひとまとめにして扱うことができるようになります。
これは、複数の開発メンバーがいるプロジェクトやフレームワークの開発でよく使われるものですので覚えておく必要があります。
PHP で名前空間を使うにはいくつかのルールがあります。
・名前空間を宣言するために namespace を使う
・名前空間の宣言は、他のコードより前にファイルの先頭で宣言する
・名前空間の階層は、バックスラッシュ(\)を使って区切る Ex. Myproject\Sub\Lavel
・指定した名前空間のクラスを参照するには、use を使う
・1 つのファイルの中には、複数の名前空間を定義できる(推奨されない)
公式リファレンスのサンプルは以下です。
<?php
namespace Foo\Bar; // 名前空間の宣言は先頭。バックスラッシュで階層を区切る
include ‘file1.php’; //include でファイル名を指定
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
/* 非修飾名 */
foo(); //Foo\Bar\foo 関数と解釈されます
foo::staticmethod(); // Foo\Bar\foo クラスの staticmethod メソッドと解釈されます
echo FOO; // 定数 Foo\Bar\FOO と解釈されます
/* 修飾名 */
subnamespace\foo(); // Foo\Bar\subnamespace\foo 関数と解釈されます
subnamespace\foo::staticmethod(); // Foo\Bar\subnamespace\foo クラスの
// staticmethod メソッドと解釈されます
echo subnamespace\FOO; // 定数 Foo\Bar\subnamespace\FOO と解釈されます
/* 完全修飾名 */
\Foo\Bar\foo(); // Foo\Bar\foo 関数と解釈されます
\Foo\Bar\foo::staticmethod(); // Foo\Bar\foo クラスの staticmethod メソッドと解釈されます
echo \Foo\Bar\FOO; // 定数 Foo\Bar\FOO と解釈されます
?>
(参考:名前空間の使用法 : 基本編 )
また、グローバルなクラス・関数・定数にアクセスする場合は、完全修飾名を使用して対応します。例え
ば、 \strlen(), \Exception, \INI_ALL などです。同じく公式リファレンスの内容を見てみます。
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen(‘hi’); // グローバル関数 strlen をコールします
$b = \INI_ALL; // グローバル定数 INI_ALL にアクセスします/ グローバルクラス Exception のインスタンスを作成します
このように、名前空間を知っておくことでプロジェクトのクラス名などを論理的に整理できるため、コードの管理が楽になりますし、PHP のほとんどの外部ライブラリでは名前空間が使われているということですので、やはり必修の部分になるんだなと思いました。
PHP8技術者認定初級試験で、正しいPHPの理解を
今回は、名前空間という概念について勉強してきました。単語だけだと何を言っているのかがわからなかったですが、実際に理解してみるとなぜ名前空間が必要なのか、どのように使っていくのかが分かるようになってきました。コードを読む際などには名前空間の意識も入れてみたいと思いました。
次回以降もPHP で学習した内容をシェアしていきますので、よろしくお願いいたします。
また、PHP の学習やエンジニアになるためのマイルストーンとして、PHP 試験はおすすめです。PHP8技術者認定初級試験はPHP を扱うあらゆる方にとって有益な試験になるはずですので、ご興味がある方はぜひチャレンジしてみてください。
試験ページ: PHP8 初級試験
公式問題集:PHP8 技術者認定初級試験公式問題集