ITHACK
~ みんなのIT部門 ~
【PHP】名前空間(namespace) – プログラムのグループ化

【PHP】名前空間(namespace) – プログラムのグループ化

PHPには名前空間と呼ばれる仕組みがあります。

クラス名や関数名などは固有の名前を付ける必要があり、重複するとエラーになりますが、名前空間の仕組みを使うことで、同じ名前のクラスや関数を作ることができるようになります。

ここでは名前空間について解説します。

  • 名前空間(namespace)

名前空間とは

名前空間はネームスペース(namespace)とも呼ばれ、プログラムをグループ化する仕組みです。

1つのプログラムで複数の名前空間を作ることができ、異なる名前空間であれば同じクラス名や関数名を使うことができます。

また、オブジェクト指向プログラミングではカプセル化するときに使います。

基本構文

名前空間の基本構文は2パターンあり、ブロック(波括弧{})を使うパターンと使わないパターンがあります。

ブロックを使うパターン

namespace ネームスペース名 {
    // コード・・・・・
}

ブロックを使わないパターン

namespace ネームスペース名;

どちらの記述方法でも同じ動作になりますが、注意点が2つあります。

  • namespaceはファイルの先頭(phpタグの次)に記述する必要がある。
  • ブロックを使う場合、ブロックの外にコードを記述できない。

ここでは、比較的多く使われているブロックなしのパターンで解説します。

サンプルコード

名前空間(namespace)を使ったサンプルコードをご覧ください。

<?php

namespace Program1;

class Person {
    
    public $name;
    
    public function __construct( $name ) {
        $this->name = $name;
    }
    
    public function profile() {
        echo "私の名前は".$this->name."です。\n";
    }
    
}

$watanabe = new Person('Watanabe You');
$watanabe->profile();

namespace Program2;

class Person {
    
    public $name;
    
    public function __construct( $name ) {
        $this->name = $name;
    }
    
    public function profile() {
        echo "My name is ".$this->name.".\n";
    }
    
}

$watanabe = new Person('Watanabe You');
$watanabe->profile();

?>
私の名前はWatanabe Youです。
My name is Watanabe You.

2つの名前空間であるProgram1とProgram2を定義しています。

名前空間の範囲はnamespaceで宣言した行より下のコードになりますが、途中で別のnamespaceがある場合は、その前行までになります。

そのため、Program1の範囲は3~21行目、Program2の範囲は22行目以降となります。

そして、Personクラスが2つありますが、これらは名前空間が違うため、エラーになりません。

実行結果からは各インスタンスのprofileメソッドが各名前空間のPersonクラスのもになっていることが分かります。

名前衝突(競合)について

同じ名前空間でクラス名や関数名が被ることを、『名前の衝突』や『名前の競合』と言います。

上記サンプルコードで名前空間の宣言をしないと、次のようにエラーになります。

<?php

class Person {
    
    public $name;
    
    public function __construct( $name ) {
        $this->name = $name;
    }
    
    public function profile() {
        echo "私の名前は".$this->name."です。\n";
    }
    
}

$watanabe = new Person('Watanabe You');
$watanabe->profile();

class Person {
    
    public $name;
    
    public function __construct( $name ) {
        $this->name = $name;
    }
    
    public function profile() {
        echo "My name is ".$this->name.".\n";
    }
    
}

$watanabe = new Person('Watanabe You');
$watanabe->profile();

?>
私の名前はWatanabe Youです。
PHP Fatal error:  Cannot declare class Person, because the name is already in use in sample.php on line 20

Fatal error: Cannot declare class Person, because the name is already in use in sample.php on line 20

実行結果でエラーが出力されていますが、これはPersonクラスが2つあるため発生しているエラーです。

演習問題

問題1

次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 名前空間のAdditionとMultiplicationを定義する
  • 各名前空間にexecute関数を定義する
  • 名前空間Additionのexecute関数は次のとおりとする
    引数 : 数値1、数値2
    処理 : 数値1と数値2の合計値を出力
  • 名前空間Multiplicationのexecute関数は次のとおりとする
    引数 : 数値1、数値2
    処理 : 数値1と数値2の乗算値を出力
====    Addition    ====
3 + 5 = 8
==== Multiplication ====
7 * 9 = 63

問題2

次の実行結果になるプログラムを作成してください。
なお、下記の条件を満たすものとします。

  • 名前空間のDriverとShopを定義する
  • 各名前空間にCarクラスを定義し、内容は次の表の通りとする
名前空間 クラス フィールド メソッド
Driver Car ・accel()
『加速』を出力する
brake()
『減速』を出力する
Shop Car $price
(値段)
・コンストラクタ
$priceの初期値を設定する
display_price()
値段($price)を出力する
==== Driver ====
加速
減速
====  Shop  ====
料金 : 3500000円

まとめ

名前空間(namespace)はプログラムをグループ化する仕組みで、オブジェクト指向ではカプセル化で使います。