LoginSignup
7
8

More than 3 years have passed since last update.

composerのautoloadとPHPの名前空間(namespace)について調べてみた

Posted at

名前空間(namespace)とは

名前空間とは、関連するクラスや、関数、定数などをグループ化するする機能の事です。通常は同じファイル内に同じ名前のクラスや関数、定数を設定する事はできませんが、名前空間を使用することにって、同じ名前のクラス名や関数名を使用することが可能になります。
そのため、名前空間を指定しておけば自分が作ったクラスや関数が他のエンジニアの作ったクラスや関数の名前と衝突することを防ぐことができます。

名前空間の設定方法

名前空間は以下のように設定します。

名前空間の定義方法
namespace 名前空間名;

名前空間の設定はPHPファイルの一番先頭に記述する必要があり、それ以外の場所で書くとエラーになります。
名前空間の影響を受けるのは「クラス」「インターフェイス」「関数」「定数」になります。

名前空間に属するクラスの指定方法
namespace 名前空間名\クラス名;
名前空間に属する関数の指定方法
namespace 名前空間名\関数名;

名前空間の実装サンプル

以下のようなディレクトリ構成でnamespaceの挙動について確認します。

ディレクトリ構成
├─app
│  ├─Controllers
│  │   └─ Controller.php
│  └─Models
│      └─ Model.php
├─public
│   └─ index.php
└─vendor
    ├─ composer
    │   ├─ autoload_classmap.php
    │   ├─ autoload_namespaces.php
    │   ├─ autoload_psr4.php
    │   ├─ autoload_real.php
    │   ├─ autoload_static.php
    │   ├─ ClassLoader.php
    │   └─ LICENSE
    └─ autoload.php

composer.jsonで名前空間を設定

まず、composer.jsonにautoloadの設定を記述します。
以下の設定ファイルのように記述するとApp\Controllers/app/Controllers/の下にControllerクラスがあるという事を指しApp\Models/app/Models/の下にModelクラスが存在するという事になります。

ちなみにcomposer.jsonの設定にはPSR-4という最新のファイル配置規約を利用します。
この規約はLaravelでも使用されており、composer.jsonを開くと確認することができます。
参考:PSR-4

composer.json
{
    "autoload": {
        "psr-4": {
            "App\\" : "app/"
        }
    }
}

composer.jsonのautoloadは編集したら以下のコマンドで更新する必要があります。

composer dumpautoload

public(ドキュメントルート)

初回アクセス時のPHPプログラムでautoload.phpをrequireします。
(リクエストによって読み込むControllerを振り分ける処理を入れたら軽量なフレームワークになりそうです。)

/public/index.php
<?php
//autoload.phpだけはrequire_onceする必要がある
require_once __DIR__ . "/../vendor/autoload.php";

#namespaceのエイリアス
use App\Models\Model;
use App\Controllers\Controller;

$app = new Controller;
$app->run();

Controller

/app/Controllers/Controller.php
<?php
namespace App\Controllers; 

use App\Models\Model;

class Controller
{
    public function run()
    {
        $Model = new Model;
        echo $Model->getHello();
    }
}

Model

/app/Controllers/Model.php
<?php
namespace App\Models;

class Model
{  
    private $text = 'Hello World' . PHP_EOL;

    public function getHello(): string{
      return $this->text;
    }

    public function setHello(string $text)
    {
      $this->text = $text;
    }
}

まとめ

大規模なMVCフレームワークの場合クラスの読み込みはrequireを使わずにautoloadを使用しているので、名前空間の記述は頻繁に目にします。そのため挙動についてはしっかり理解する事が必要だと思いました。composerを使わない場合spl_autoload_register関数でオートロードを実装する事が可能みたいですが、おとなしくcomposer使った方がよさそうです。

課題

PSR-4の仕様についてはもっと理解を深める必要がありそうです。

composerのautoloadと名前空間の忘備録でした。

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8