【PHP】インポート(namespace / use) - 別名前空間の機能を利用する
PHPにはインポートと呼ぶ仕組みがあります。
インポートを使うことで、別の名前空間の機能を使用することができます。
ここでは、インポートについて解説します。
検証環境
インポート
インポートは“別の名前空間の機能を参照すること”です。
代表的な方法は2つあり、完全修飾名指定とuseキーワード利用があります。
完全修飾子名指定
完全修飾名は“名前空間から指定した機能名”です。
基本構文
// 関数
\名前空間\関数名
// クラス
\名前空間\クラス名
名前空間に続いて、関数名やクラス名を記述します。
例えば、名前空間が\Program\Functions
のaddition
関数の完全修飾子名は\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\Functions
のaddition
関数と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\Objects
のPerson
クラスを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\Objects
のPerson
クラスをインポートしています。
これにより、24行目のように名前空間Program
でPerson
クラスをクラス名のみで使うことが可能です。
別名の命名
インポートするクラスと同じクラス名の定義がある場合、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行目で名前空間Program1
のPerson
クラスをインポートしていますが、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行目で名前空間Program1
のPerson
クラスをHuman
という別名でインポートしています
42行目でHuman
を使った、オブジェクトの生成に成功しており、var_dump
関数の出力結果から生成したオブジェクトは名前空間Program1
のPerson
クラスであることが分かります。
演習問題
次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。
- 名前空間CalculationとProgramを作成する
- 名前空間Calculationにaddition関数を作成し、次の定義に従う
引数 : 数値1、数値2
処理 : 数値1と数値2の合計値を出力 - 名前空間Calculationにmultiplication関数を作成し、次の定義に従う
引数 : 数値1、数値2
処理 : 数値1と数値2の乗算値を出力 - 名前空間Programからadditionとmultiplicationを呼び出す
3 + 5 = 8
7 * 9 = 63
次の実行結果になるプログラムを作成してください。
なお、下記条件を満たすものとします。
- 名前空間ShopとLiveを作成する
- 各名前空間に次の表のクラスを作成する
名前空間 | クラス | 継承 | フィールド | メソッド |
---|---|---|---|---|
Shop | Ticket | – | $price
(値段) |
・display_price()
値段を出力する |
Live | LiveTicket | Ticket | $place
(場所) |
・コンストラクタ
$priceと$placeを初期化 ・ info()
値段($price)と場所($place)を出力する |
場所 : ライブハウス
料金 : 8000円