【PHP】インポート(namespace / use) - 別名前空間の機能を利用する

【PHP】インポート(namespace / use) - 別名前空間の機能を利用する

PHPにはインポートと呼ぶ仕組みがあります。

インポートを使うことで、別の名前空間の機能を使用することができます。

ここでは、インポートについて解説します。

検証環境

インポート

インポートは“別の名前空間の機能を参照すること”です。

代表的な方法は2つあり、完全修飾名指定とuseキーワード利用があります。

完全修飾子名指定

完全修飾名は“名前空間から指定した機能名”です。

基本構文

// 関数
\名前空間\関数名
// クラス
\名前空間\クラス名

名前空間に続いて、関数名やクラス名を記述します。

例えば、名前空間が\Program\Functionsaddition関数の完全修飾子名は\Program\Functions\additionです。

サンプル

関数とクラスのインポートについて、完全修飾名指定のサンプルを以下に示します。

関数

<?php

namespace Program\Functions;

function addition( $x, $y ) {
    $total = $x + $y;
    echo $x." + ".$y." = ".$total."\n";
}

function subtraction( $x, $y ) {
    $total = $x - $y;
    echo $x." - ".$y." = ".$total."\n";
}

namespace Program;

___ih_hl_start
\Program\Functions\addition(3, 5);
\Program\Functions\subtraction(3, 5);
___ih_hl_end

?>
$ php sample.php
3 + 5 = 8
3 - 5 = -2

名前空間Programから別の名前空間Program\Functionsaddition関数とsubtraction関数を17〜18行目で呼び出しています。

実行結果から正常に処理されたことが分かります。

クラス

<?php

namespace Program\Objects;

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

namespace Program;

___ih_hl_start
$person = new \Program\Objects\Person('TANAKA');
___ih_hl_end
$person->greeting();

?>
$ php sample.php
Hello.
My name is TANAKA.

名前空間Programから別の名前空間Program\ObjectsPersonクラスを22行目で使用しています。

useキーワード利用

useキーワードを使って名前空間を省略することができます。

基本構文

// 名前空間に別名を付ける
use 名前空間 as 省略名
// クラスのみ
use 名前空間\クラス名

名前空間に別名を付けて省略したり、クラス利用時に名前空間を省略することができます。

サンプル

関数とクラスのインポートについて、useキーワードのサンプルを以下に示します。

関数

<?php

namespace Program\Functions;

function addition( $x, $y ) {
    $total = $x + $y;
    echo $x." + ".$y." = ".$total."\n";
}

function subtraction( $x, $y ) {
    $total = $x - $y;
    echo $x." - ".$y." = ".$total."\n";
}

namespace Program;

___ih_hl_start
use \Program\Functions as PF;
___ih_hl_end

PF\addition(3, 5);
PF\subtraction(3, 5);

?>
$ php sample.php
3 + 5 = 8
3 - 5 = -2

17行目で名前空間Program\Functionsの別名としてPFを定義しています。

19〜20行目でPFを使って、addition関数とsubtraction関数を呼び出しており、実行結果から正常に動作したことが分かります。

クラス

<?php

namespace Program\Objects;

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

namespace Program;

___ih_hl_start
use \Program\Objects\Person;
___ih_hl_end

$person = new Person('TANAKA');
$person->greeting();

?>
$ php sample.php
Hello.
My name is TANAKA.

22行目で名前空間\Program\ObjectsPersonクラスをインポートしています。

これにより、24行目のように名前空間ProgramPersonクラスをクラス名のみで使うことが可能です。

別名の命名

インポートするクラスと同じクラス名の定義がある場合、useキーワードのみでは正常にインポートできません。

例えば次のようなケースです。

<?php

namespace Program1;

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

$person = new Person('TANAKA');
$person->greeting();

namespace Program2;

___ih_hl_start
use \Program1\Person;
___ih_hl_end

class Person {
    
    public $name;
    
    public function __construct( $name ) {
        $this->name = $name;
    }
    
    public function greeting() {
        echo "Hey.\n";
        echo "I'm ".$this->name.".\n";
    }
    
}
 
$person = new Person('SUZUKI');
$person->greeting();
 
?>
$ php sample.php
PHP Fatal error:  Cannot declare class Program2\Person because the name is already in use in sample.php on line 27

25行目で名前空間Program1Personクラスをインポートしていますが、27行目に同名のクラスを定義したため、重複エラーが発生しています。

そのため、同名のクラスを定義する場合はインポートするクラスを完全修飾名で指定するかasキーワードで別名を付けます。

<?php

namespace Program1;

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

$person = new Person('TANAKA');
$person->greeting();

namespace Program2;

___ih_hl_start
use \Program1\Person as Human;
___ih_hl_end

class Person {
    
    public $name;
    
    public function __construct( $name ) {
        $this->name = $name;
    }
    
    public function greeting() {
        echo "Hey.\n";
        echo "I'm ".$this->name.".\n";
    }
    
}
 

$person = new Human('SUZUKI');
$person->greeting();

var_dump($person);
 
?>
$ php sample.php
Hello.
My name is TANAKA.
Hello.
My name is SUZUKI.
object(Program1\Person)#2 (1) {
  ["name"]=>
  string(6) "SUZUKI"
}

25行目で名前空間Program1PersonクラスをHumanという別名でインポートしています

42行目でHumanを使った、オブジェクトの生成に成功しており、var_dump関数の出力結果から生成したオブジェクトは名前空間Program1Personクラスであることが分かります。

演習問題

問題1

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

  • 名前空間CalculationとProgramを作成する
  • 名前空間Calculationにaddition関数を作成し、次の定義に従う
    引数 : 数値1、数値2
    処理 : 数値1と数値2の合計値を出力
  • 名前空間Calculationにmultiplication関数を作成し、次の定義に従う
    引数 : 数値1、数値2
    処理 : 数値1と数値2の乗算値を出力
  • 名前空間Programからadditionとmultiplicationを呼び出す
3 + 5 = 8
7 * 9 = 63

問題2

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

  • 名前空間ShopとLiveを作成する
  • 各名前空間に次の表のクラスを作成する
名前空間 クラス 継承 フィールド メソッド
Shop Ticket $price
(値段)
・display_price()
値段を出力する
Live LiveTicket Ticket $place
(場所)
・コンストラクタ
$priceと$placeを初期化
info()
値段($price)と場所($place)を出力する
場所 : ライブハウス
料金 : 8000円