Lesson 11

名前空間

Lesson 11 Chapter 1
名前空間

Lesson11では名前空間について学習していきます。名前空間の存在は開発を行う段階から、開発後の運用に至るまで主に効率化へ該当します。

名前空間とは

簡単に説明すると名前空間とは関数名やクラス名などの競合を防ぐ為にグループ分けしておく仕組みのことを言います。 実際の現場では複数人でプロジェクトを遂行する場合がほとんどで、記述量も増え関数名やクラス名で重複が発生しやすくなります。

例えば…

A、B、Cの3ファイルがあるとしましょう。

①Aファイルに検索の処理としてSearch関数を定義。

②Bファイルに検索の処理としてSearch関数を定義。

③CファイルでAとBファイルを読み込み、AファイルのSearch関数を使用したい。

④CファイルはAとBどちらのSearch関数なのか判断できず、エラー発生。

関数名やクラス名を変えるのも一つの手ですが、今後追加機能があったり、コード量が増えていくことを想定するとリスクも高く、開発のしづらい環境となってしまいます。 これらを防ぐために名前空間という仕組みを取り入れておくことが大切になります。

名前空間を使用しておくことで…

①Aファイルに検索の処理としてSearch関数を定義。

②Bファイルに検索の処理としてSearch関数を定義。

③CファイルでAとBファイルを読み込み、AファイルのSearch関数を使用したい。

(ここまでは同じ)

④Cファイルで「Aファイルに定義されているSearch関数」と具体的に使用することが可能。

このように◯◯で定義されている◯◯関数を使用する。と限定することができれば、関数名が変わったり追加されたりしても処理に影響なく開発を進めていくことが実現できます。 又、開発者は「誰が見てもわかりやすく丁寧なコード」を心掛ける必要があるので、そういった意味でも名前空間を使用すると良いでしょう。

Lesson 11 Chapter 2
名前空間の使用

それでは実際に名前空間を使用してみましょう。 名前空間名は任意ですが、別ファイルの名前空間名の被らないよう注意してください。

名前空間 namespace

名前空間
namespace 名前空間;

例をもとに学習していきます。下記構成でファイルを作成しましょう。

XAMPP > htdocs > Lesson11 > subA.php

subA.php
<?php

namespace subA

function HelloMessage(){
  return "hello_A";
}

XAMPP > htdocs > Lesson11 > subB.php

subB.php
<?php

namespace subB

function HelloMessage(){
  return "hello_B";
}

解説

subA.phpとsubB.phpファイルは呼び出される側のファイルになります。共にHelloMessage関数を定義しました。

又、名前空間は「namespace 名前空間名;」で定義します、今回はファイル名と同じsubAとsubBにしましたが、任意になります。

続いて呼び出す側のファイルを作成します。

XAMPP > htdocs > Lesson11 > main.php

main.php
<?php
require_once "subA.php";
require_once "subB.php";

echo subA\HelloMessage();
echo "<br>"
echo subB\HelloMessage();

解説

外部ファイルを読み込む為、それぞれのファイルをrequire_onceしています。

「名前空間名\関数名();」とすることで任意のファイルの関数を呼び出すことができます。

出力結果
hello_A
hello_B

このようにそれぞれのファイルで定義した同じ関数の呼び出しに成功しました。

注意

関数を呼び出す際に名前空間の記述がないとエラーになるので注意しましょう。

続いてnamespaceと同時に「use」についても学習しましょう。 今回はsubAとsubBとしていますが、名前空間名が長い命名だったりすると毎回呼び出す際に手間になります。 useを使用することで呼び出す際の名前空間名を変更することが可能です。

名前空間 use

use
use 名前空間名 as 呼び出す際の名前空間名;

main.phpにuseを追加します。

XAMPP > htdocs > Lesson11 > main.php

main.php
<?php
require_once "subA.php";
require_once "subB.php";

// 追加
use subA as sA;
// 追加
use subB as sB;

echo sA\HelloMessage();
echo "<br>"
echo sB\HelloMessage();

解説

useしたことで今後は「sA、sB」と短縮して関数などを呼び出すことが可能です。

出力結果
hello_A
hello_B

このように基本的にはnamespaceとuseはセットで使用していくことが多くあるので認識しておきましょう。上記は関数の呼び出しを行いましたが、クラスを使用している場合は下記になります。

subA.php
<?php
namespace subA;

class HelloMessageA
{
  function HelloMessage(){
    return "hello_A";
  }
}
subB.php
<?php
namespace subB;

class HelloMessageB
{
  function HelloMessage(){
    return "hello_B";
  }
}
main.php
<?php
require_once "subA.php";
require_once "subB.php";

use subA as sA;
use subB as sB;

//「new 名前空間\クラス名」でインスタンス化
$helloA = new sA\HelloMessageA;
$helloB = new sB\HelloMessageB;

// インスタンス化したクラスからメソッドを実行
echo $helloA->HelloMessage();
echo $helloB->HelloMessage();

名前空間のまとめ

  • 名前空間とは関数名やクラス名などの競合を防ぐ為にグループ分けしておく仕組みのこと。
  • namespaceの定義は「namespace 名前空間名;」とする。
  • ファイル内の関数を呼び出す際は「名前空間名\関数名();」とする。
  • useすることで呼び出す際の名前空間名を変更できる。