はじめに
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` を簡単に使える
}
}