PHPのキーワードnamespaceについて現役エンジニアが解説【初心者向け】

初心者向けにPHPのキーワードnamespaceについて現役エンジニアが解説しています。namespaceとは名前空間のことで、別名のフォルダやファイル名を付けるような形で、関数名やクラス名の衝突を防ぐことが出来ます。PHPのnamespaceキーワードの書き方や使い方について解説します。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事が4,000以上あります。現役エンジニアの方はこちらをご覧ください。

今回は、PHPのキーワードnamespaceについて、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。

 

PHPについてそもそもよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まります。

 

なお本記事は、TechAcademyのオンラインブートキャンプ、PHP/Laravel講座の内容をもとに紹介しています。

 

田島悠介

今回は、PHPに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

PHPのキーワードnamespaceについて詳しく説明していくね!

大石ゆかり

お願いします!

 

名前空間とは

名前空間とは項目(クラスや関数など)をカプセル化(グループ化)することをいいます。

PCにファイルを保存する時、同じフォルダに同じファイル名で保存することはできませんよね?

それは、同じ名前空間に同じ名前のファイルを保存すると名前の衝突が起きるからです。そのどちらかのファイルを開く時に、コンピューターはどちらのファイルを開けばいいのか判断ができないためです。

しかし、フォルダAとフォルダBを作成すれば、それぞれに同じファイル名のファイルを保存することが可能です。(A/file.txt、B/file.txt)

これは、Aという名前空間とBという名前空間が別であるために、「Aというフォルダに保存してあるfile.txt」と、「Bというフォルダに保存してあるfile.txt」は別物であるとコンピューターは判断できるためです。

日常生活で言えば、名前に対して苗字をつける感覚に似ています。2人の太郎くんが同じ学校のクラスにいたとして、「太郎くん」と呼ばれただけでは、どちらの太郎くんが呼ばれたのか分からないですよね。でも、「田中太郎くん」と「鈴木太郎くん」と呼ばれれば、どちらが呼ばれたか判断できますよね。

PHPの名前空間もPCの名前空間の延長線上にあり、そういった名前の衝突を防ぐために使用されます。
 

namespaceキーワードの使い方

PHPでは、同じファイルに同一名のクラス、インターフェイス、関数、定数を定義できません。

しかし、PHPのnamespaceキーワードを使用するこで、上記の項目に名前空間を提供し、同じファイルであっても定義すること可能になります。

それでは、namespaceキーワードの使い方について見てみましょう。
 

namespaceの書き方

namespace 名前空間名;

クラスや関数などの前に、「namespace 名前空間名;」を記述することで、それ以降に記載するクラスや関数などの項目に名前空間名で記載した名前空間を提供することができます。
 

サンプルコード

<?php
namespace tanaka;
class Taro {
    public function getName() {
        return '田中太郎';
    }
}
namespace suzuki;
class Taro {
    public function getName() {
        return '鈴木太郎';
    }
}
?>

上記のサンプルコードでは、一つ目のクラスTaroが名前空間tanakaに属していて、二つ目のクラスTaroが名前空間suzukiに属しています。
 

[PR] PHPのプログラミングで挫折しない学習方法を動画で公開中

実際に書いてみよう

それでは、実際にnamespaceキーワードで名前空間を作成し、使用する例を見てその効果を確認しましょう。
 

名前空間を使用しない場合

まずは、名前空間を使用せずに同一ファイル内でクラスを定義した場合の例を見てみましょう。

person1.php:

<?php
    class Taro {
        public function getName() {
            return'田中太郎';
        }
    }
?>

person2.php:

<?php
    class Taro {
        public function getName() {
            return'鈴木太郎';
        }
    }
?>

call.php:

<?php
require_once 'person1.php';
require_once 'person2.php';

 

call.php実行結果

PHP Fatal error:  Cannot declare class Taro, because the name is already in use in person2.php on line 2

上記では、call.phpに2つのファイルperson1.phpとperson2.phpを取り込み実行しています。

2つのファイルを取り込むことで、各々のファイル内に定義してあるクラスTaroがcall.php内で2つ定義されたことになり、「既にクラスTaroは定義済みなので、定義できない」というエラーが出力されます。
 

名前空間を使用する場合

次にnamespaceキーワードを使用して、名前空間を作成した時の例です。

person1.php:

<?php
namespace tanaka;
class Taro {
    public function getName() {
        return '田中太郎';
    }

}
?>

person2.php:

<?php
namespace suzuki;
class Taro {

    public function getName() {
        return '鈴木太郎';
    }
}
?>

call.php:

<?php
require_once 'person1.php';
require_once 'person2.php';
$person1 = new tanaka\Taro();
$person2 = new suzuki\Taro();
echo '私の名前は、'.$person1->getName().'です'."\n";
echo '私の名前は、'.$person2->getName().'です'."\n";
?>

 

実行結果

私の名前は、田中太郎です
私の名前は、鈴木太郎です

上記のサンプルコードでは、namespaceキーワードを使用することで各々のクラスTaroに名前空間が作成されています。

call.phpに呼び出された時には、tanaka\Taroとsuzuki\Taroという形で定義されていることになるので、同一のクラス名であっても別々のものとして定義されているこになります。

上記の通り、namespaceキーワードを使用した場合は、「名前空間名\クラス名」というバックスラッシュで区切る形でインスタンスを生成します。

もし名前空間を使用した関数を呼び出す時は、「名前空間名\関数名」という形で呼び出します。
 

まとめ

以上、PHPのnamespaceキーワードを使用して名前空間を作成する方法を紹介しました。

名前空間を使用することで、クラス名と関数名に同一の名前にすることができるので読みにくい名前をつけずに済みます。

また名前空間によってグルーピングされることによって、その機能が何に使われるのか分かりやすくなる効果もあります。

namespaceキーワードによる名前空間の作成方法を覚えて、よりよいコーディングができるようになりましょう。
 

筆者プロフィール

平野大輝(ひらのだいき)

スキル:PHP・Java・JavaScriptを用いて様々なアプリを開発するWebエンジニア。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

TechAcademyでは、初心者でも最短4週間で、PHPやフレームワークのLaravelを使ってWebアプリケーション開発を習得できる、オンラインブートキャンプを開催しています。

また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。