こんにちは。明月です。
この投稿は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キーワードに関する説明でした。
ご不明なところや間違いところがあればコメントしてください。
- [CakePHP] Errorページを設定する方法2020/02/20 03:00:00
- [CakePHP] Transactionを使う方法とEntityクラスを利用してInsert、Update、Deleteする方法2020/02/19 03:00:00
- [CakePHP] ORMのテーブルFetch設定2020/02/18 03:00:00
- [CakePHP] Cakeフレームワークでデータベースに接続する時に使うQuery式とEntityクラス、Tableクラス、ResultSet2020/02/17 08:16:23
- [CakePHP] データベース(MariaDB(Mysql))を接続する方法2020/02/14 03:00:00
- [PHP] namespaceとuse2020/02/13 03:00:00
- [CakePHP] RequestとResponseに関して2020/02/12 03:00:02
- [CakePHP] PHPのCakeからAjax要請がある時、jsonタイプ(json_encode関数)でResponseする方法とControllerでViewを選択する方法2020/02/08 03:00:00
- [CakePHP] MVCフレームワークのCakeをインストールする方法2020/02/07 03:00:02
- [PHP] 自動require及びincludeをする方法(spl_autoload_register)2020/02/05 03:00:00
- [PHP] 匿名関数(ラムダ式)とクロージャ(closure)2020/02/04 03:00:00
- [PHP] PHPのコーディング領域とデザイン領域を分離するテンプレートライブラリ Smarty2020/02/02 03:00:00
- [PHP] Reflection - Variable編2020/02/01 03:00:00
- check2024/04/10 19:03:53
- [Java] 64.Spring bootとReactを連結する方法(Buildする方法)2022/03/25 21:02:18
- [Javascript] Node.jsをインストールしてReactを使う方法2022/03/23 18:01:34
- [Java] 63. Spring bootでcronスケジューラとComponentアノテーション2022/03/16 18:57:30
- [Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)2022/03/15 22:16:37
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法2022/03/01 18:20:52
- [Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法2022/02/28 18:45:48
- [Java] 59. Spring bootのJPAでEntityManagerを使い方2022/02/25 18:27:48
- [Java] 58. EclipseでSpring bootのJPAを設定する方法2022/02/23 18:11:10
- [Java] 57. EclipseでSpring bootを設定する方法2022/02/22 19:04:49
- [Python] Redisデータベースに接続して使い方2022/02/21 18:23:49
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [CentOS] Redisデータベースをインストールする方法とコマンドを使い方2022/02/14 18:33:07