名前空間(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
{
"autoload": {
"psr-4": {
"App\\" : "app/"
}
}
}
composer.jsonのautoloadは編集したら以下のコマンドで更新する必要があります。
composer dumpautoload
public(ドキュメントルート)
初回アクセス時のPHPプログラムでautoload.phpをrequireします。
(リクエストによって読み込むControllerを振り分ける処理を入れたら軽量なフレームワークになりそうです。)
<?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
<?php
namespace App\Controllers;
use App\Models\Model;
class Controller
{
public function run()
{
$Model = new Model;
echo $Model->getHello();
}
}
Model
<?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と名前空間の忘備録でした。