[PHP] namespaceとuse


Study / PHP    作成日付 : 2020/02/13 03:00:00   修正日付 : 2020/02/13 03:00:00

こんにちは。明月です。


この投稿はPHPのnamespaceとuseキーワードに関する説明です。


現在CakePHPフレームワークに関する分析や説明をしていますが、急にPHP基礎文法に戻りました。

実はPHPの中でnamespaceやuseをよく使いならソース管理に良いですが、ライブラリ開発じゃない以上、すごく大事なところじゃなかったので省略しようと思いました。

でも、やはりMVCモデルで開発するためにはパッケージ区分が必要と思って説明します。


namespaceとuseとはC#の場合はnamespaceとusing、Javaの場合はpackageとimportと同じ意味です。

最近、プロジェクトサイズが以前より大きいし様々なライブラリを参照しています。それでクラス名をプロジェクト中で雄一なことに決めることが難しいです。

例えば、データベースを2つを扱うプロジェクトということに考えてみましょう。

そのデータベースの種類がmysqlとoracleといえばRDBMSのタイプなのでライブラリがすごく似ていると思います。そのため、コネクションするクラス名がmysqlライブラリは「Connection」という名を、oracleライブラリでも「Connection」と実装されていると思えばユーザがConnectionクラスを割当てする時にプログラムはどのConnectionを宣言するか競合エラーになるはずです。

他の例ではxmlデータを扱うライブラリでオブジェクトを作成するBuildクラスがあるし、jsonデータを扱うライブラリでもオブジェクトを作成するBuildクラスがあると思えば、Buileクラスを割当てする時にプログラムはどのクラスを宣言するかを分からないです。

そうすると、全てもPHPのライブラリのクラス名は固有名で作成しなければならないですが、現実的にありえないことでしょう。


同じクラス名でも区別するためにnamespaceがあります。

useの場合はnamespaceをパッケージを使用する明示的に宣言することです。

<?php
//namespace Test1の属するTestClass
namespace Test1;
class TestClass {
  public function print() {
    return "Test1";
  }
}
//namespace Test2に属するTestClass
namespace Test2;
class TestClass {
  public function print() {
    return "Test2";
  }
}
	
namespace App\Controller;
// Test1のnamespaceを宣言
use Test1\TestClass;

class HomeController extends AppController {
  public function index() {
    // ここで割当てするTestClassはTest1のnamespaceのクラスだ。なぜなら、上にuseでTest1\TestClassを使うと予約宣言したからだ。
    $this->set("data",new TestClass());
  }
}
<!-- Controllerから渡してもらったTestClassのprint関数を呼出す。-->
<!-- ControllerでTest1のnamespaceのTestClassを割当てしたので結果は「Test1」だ。-->
{$data->print()}


上の例はTestClassが2つあります。namespaceは各Test1とTest2にあるので、別のクラスです。

もし、namespaceを使ってないなら同じクラス名が重複されたというエラーメッセージがでます。エラーメッセージが出ない(エラーオプション設定で。)と言ってもControllerでTestClassを割当てすると思えばなにを割当てするかしらないでしょう。


HomeConrollerでnew TestClassを宣言する時に、useで使うnamespaceを予約宣言しましたので、TestClassはTest2/TestClassのことを分かることでしょう。



今回はuseを予約宣言クラスをTest2\TestClassに修正しました。結果は「Test2」が得ることを確認できます。


上の例では一つのページで様々なnamespaceを宣言しましたが、実際にはフォルダ構造としてnamespaceが決めます。

/Commonフォルダに共通クラスを集める構造だと、Util関係なクラスはnamespaceをCommonに決めることです。


我々がPHPを使うことなら普通はウェブサイトを構築するために使います。

なので様々なライブラリを参照して使う立場なのでnamespaceとuseは知らなくてもPHPでサイト運用で問題ないと思いました。でもCakePHPには管理するクラスが多いし、CakePHPのフレームワークが大きいからプロジェクトサイズが大きくなるのでnamespaceとuseキーワードを使わないことができないです。

そのため、調査して説明しました。


link - https://www.php.net/manual/en/language.namespaces.basics.php


ここまでPHPのnamespaceとuseキーワードに関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

最新投稿