はじめに
php(Yii)の開発に携わることになったので、初歩的な内容ですが気になった点をまとめています。
namespace(名前空間)が必要な理由
1. 名前の衝突を防ぐ
例えば、MVCのフレームワークにおいてmodels フォルダに User クラスを作成したとします。
namespace app\models;
class User {
// モデルのコード
}
しかし、別のディレクトリ controllers にも User クラスを作成した場合、PHP は どの User を指すのか区別できません。
namespace app\controllers;
class User {
// コントローラーのコード
}
このように、同じ名前のクラスが複数存在する場合に、namespace を使って整理することが重要になります。
2. 名前空間がないとクラスを使うのが大変
例えば models\User クラスを controllers\User から使いたい場合、名前空間がないと次のような問題が発生します。
// どの User を使うのかわからずエラー
$user = new User();
しかし、namespaceを使うと、どの Userなのか明確になります。
$user = new \app\models\User(); // フルネームで指定
これにより、同じ名前のクラスが複数あっても、適切なクラスを使い分けることができます。
use 文の役割
use 文は、名前空間を省略してコードを簡潔に書くために使います。
1. use 文がない場合
models\User クラスを controllers\User から使う場合、フルネームを毎回書く必要があります。
$user = new \app\models\User();
2. use 文を使う場合
use 文を使えば、フルネームを省略して書けます。
use app\models\User;
$user = new User(); // 短くて分かりやすい
これにより、コードが短く、可読性が向上 します。
PHP:名前空間の使用法: エイリアス/インポート
https://www.php.net/manual/ja/language.namespaces.importing.php
namespace と use の関係まとめ
| 概念 | 役割 |
|---|---|
namespase |
クラス名の衝突を防ぐための識別子 |
use |
名前空間を省略し、コードを短くする |
例:namespace と use の関係
namespace app\controllers;
use app\models\User; // `app\models\User` を `User` として使える
class SiteController {
public function actionIndex() {
$user = new User(); // `app\models\User` を簡単に使える
}
}