名前空間とエイリアスついて

2021/12/19

Laravelのソースコードを開くとコントローラやモデルの先頭に

「namespace」「use」といった記述がされています。

namespaceとはPHP5.3から取り入れられた「名前空間」という仕組みです。

名前空間を使うとクラスをディレクトリ構造のように階層的に分類することが出来ます。

今回はPHPの名前空間についてエントリーします。

 

名前空間のメリット

名前空間がなかったときの問題点

名前空間という仕組みがなかったとき、よくクラス名の衝突が起きていました。

例えばlibrary1.phpとlibrary2.phpに同じクラス名を指定したとします。

<?php
class Type {
  public function echo_framework() {
  return 'Laravel';
  }
}
<?php
class Type {
  public function echo_framework() {
  return 'Cake PHP';
  }
}

この二つのライブラリを読み込んで、インスタンスのメソッドを実行してみます。

<?php

require_once 'library1.php';
require_once 'library2.php';

$type = new Type();
echo $type->echo_framework();

実行結果は以下のようにクラス名の重複でエラーになります。

 

名前空間の仕組みで解決

クラス定義ファイルの頭にnamespaceで名前空間を定義します。


namespace Framework1;

class Type {
  public function echo_framework() {
  return 'Laravel';
  }
}

namespace Framework2;

class Type {
  public function echo_framework() {
  return 'Cake PHP';
  }
}

名前空間を定義した場合、インスタンスの生成は以下のような記述になります。

<?php

require_once 'library1.php';
require_once 'library2.php';

$type = new Framework1\Type();
echo $type->echo_framework()."<br>";

$type = new Framework2\Type();
echo $type->echo_framework()."<br>";

 

【解説】
名前空間はディレクトリ構造に近い考え方です。
この仕組みを利用することで同じクラス名でも重複エラーを避けることができます。

Framework1
 ┗ typeクラス

Framework2
 ┗ typeクラス

実行結果は以下のようになります。クラスの重複エラーを回避することができました。

 

useのメリット

深い階層の名前空間に属するクラスを利用する場合、フルパスの記述は冗長になります。

この場合useを使ってエイリアス(別名)でパスの記述を短くできます。

サンプルをまじえて理解していきます。

まずはサンプルのライブラリ。

ex) 読み込み先のファイルの名前空間の階層が深いケース

<?php

namespace Http\Web\Program\Php\Framework;

class Type1 {
  public function echo_framework() {
  return 'Laravel';
  }
}

class Type2 {
  public function echo_framework() {
  return 'CakePHP';
  }
}

class Type3 {
  public function echo_framework() {
  return 'Zend Framework';
  }
}

 

useを使わなかった場合

インスタンスを生成するごとに長いフルパスを記述しないといけません。

<?php

require_once 'library1.php';

//インスタンス生成
$type1 = new Http\Web\Program\Php\Framework\Type1();
$type2 = new Http\Web\Program\Php\Framework\Type2();
$type3 = new Http\Web\Program\Php\Framework\Type3();

//クラスのメソッドを実行
echo $type1->echo_framework()."<br>";
echo $type2->echo_framework()."<br>";
echo $type3->echo_framework()."<br>";

 

useを使った場合

「use」でエイリアスを作成すると、「Framework」だけで参照することができます。

<?php

require_once 'library1.php';

use Http\Web\Program\Php\Framework;

//インスタンス生成
$type1 = new Framework\Type1();
$type2 = new Framework\Type2();
$type3 = new Framework\Type3();

//クラスのメソッドを実行
echo $type1->echo_framework()."<br>";
echo $type2->echo_framework()."<br>";
echo $type3->echo_framework()."<br>";

 

Laravelで使われているところ

モデル

namespace App;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
  :

コントローラ

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;

class UserController extends Controller
{
  :

名前空間の概念が理解できると、Laravelの理解も一層深まると思います。

 
以上です。

PHP おススメ教材(by Udemy)

 

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-周辺知識