【PHP】namespaceとuseについて – 異なる名前空間のコードを使う

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

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

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

★ 目的

  • 異なる名前空間でコードを使う仕組みを理解する。
  • 異なる名前空間でコードを使えるようになる。

異なる名前空間のコードを使うには

異なる名前空間のコードを使うには、2パターン方法があります。

1つ目は名前空間からコードを記述する方法、2つ目はuseを使う方法です。

先ずは1つ目の方法から見ていきましょう。

名前空間からコードを記述する方法

基本構文

名前空間からコードを記述する方法の構文は次のようになります。

// 引数の場合
\名前空間\関数(引数);
// クラスの場合
\名前空間\クラス;

サンプルコード

次のサンプルコードを見てみましょう。

ソースコード

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

$nishikino = new \Program\Objects\Person('Nishikino Maki');
$nishikino->profile();

?>

実行結果

私の名前はWatanabe Youです。
私の名前はNishikino Makiです。

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

関数・クラスのいずれの場合でも初めに名前空間を指定することで利用が可能となります。

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

使わない場合に比べ、関数呼び出しのコード(20行目と21行目)が簡潔になりました。

これは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();

$nishikino = new Person('Nishikino Maki');
$nishikino->profile();

?>

実行結果

私の名前はWatanabe Youです。
私の名前はNishikino Makiです。

インスタンスの生成(27行目と30行目)がスッキリしました。

これは25行目で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 /source-code/sample.php on line 28

Fatal error: Cannot declare class Program\Person because the name is already in use in /source-code/sample.php on line 28

同じクラス名の定義がある場合は、名前空間から指定する方法か、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で使うことを宣言します。

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