ITHACK
~ みんなのIT部門 ~
【PHP】インポート – namespaceとuse

【PHP】インポート – namespaceとuse

異なる名前空間(namespace)のコードを使う仕組みがあります。

ここでは異なる名前空間のコードを使う方法を解説します。

なお、名前空間については次の記事をご覧ください。

  • インポート(異なる名前空間のコードを使う方法)

異なる名前空間のコードを使う方法

異なる名前空間のコードを使う方法は2パターンあります。
1つ目は名前空間から指定する方法、2つ目は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;

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

?>
3 + 5 = 8
3 - 5 = -2

名前空間がProgram\Functionsのaddition関数とsubtraction関数を異なる名前空間(Program)から使っています。

実行結果から正常に実行されていることが分かります。

クラスの場合は次のようになります。

<?php

namespace Program\Objects;

class Person {
    
    public $name;
    
    public function __construct( $name ) {
        $this->name = $name;
    }

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

}

namespace Program;

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

?>
私の名前はWatanabe Youです。

こちらは名前空間がProgram\ObjectsのPersonクラスを別の名前空間(Program)から使用しています。

関数・クラスのいずれの場合でも名前空間から指定することで使うことができます。

useを使う方法

useを使うと名前空間を省略することができます。
また、useを使って他の名前空間のコードを使うことをインポートと呼びます。

基本構文

useを使う方法の基本構文は次のようになります。

// 名前空間のインポート
use 名前空間 as 短縮名;
// クラスのみの場合
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;

use Program\Functions as pf;

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

?>
3 + 5 = 8
3 - 5 = -2

名前空間から指定する方法に比べ、関数呼び出しのコード(21行目と22行目)が簡潔になりました。

これは19行目でuseを使ってProgram\Functionsをインポートし、省略名でpfを定義しているためこのような書き方ができます。

クラスの場合は次のようになります。

<?php

namespace Program\Objects;

class Person {

    public $name;

    public function __construct( $name ) {
        $this->name = $name;
    }

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

}

namespace Program;

use \Program\Objects\Person;

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

?>
私の名前はWatanabe Youです。

23行目のインスタンスの生成がスッキリしました。

これは21行目でuseでクラス名まで指定してインポートしているため、Personクラスを使う時はクラス名のみで使えるようになります。

注意点

異なる名前空間同士で同じクラス名の定義がある場合は、クラス名まで指定したuseは使用できません。

<?php

namespace Program\Objects;

class Person {

    public $name;

    public function __construct( $name ) {
        $this->name = $name;
    }

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

}

namespace Program;

use \Program\Objects\Person;

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();

?>
PHP Fatal error:  Cannot declare class Program\Person because the name is already in use in sample.php on line 23

Fatal error: Cannot declare class Program\Person because the name is already in use in sample.php on line 23

同じクラス名の定義がある場合は、名前空間から指定する方法か、useのasで短縮名または別名でインポートします。

名前空間から指定する場合

<?php

namespace Program\Objects;

class Person {

    public $name;

    public function __construct( $name ) {
        $this->name = $name;
    }

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

}

namespace Program;

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


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

?>
私の名前はWatanabe Youです。

useのasで短縮名でインポート

<?php

namespace Program\Objects;

class Person {
    
    public $name;

    public function __construct( $name ) {
        $this->name = $name;
    }

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

}

namespace Program;

use \Program\Objects as pb;

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


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

?>
私の名前はWatanabe Youです。

useのasで別名でインポート

<?php

namespace Program\Objects;

class Person {

    public $name;

    public function __construct( $name ) {
        $this->name = $name;
    }

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

}

namespace Program;

use \Program\Objects\Person as OPerson;

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


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

?>
私の名前はWatanabe Youです。

演習問題

問題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円

まとめ

異なる名前空間の関数やクラスを使うにはuseで使うことを宣言します。

フレームワークなどで頻繁に使われるので、覚えておきましょう。