PHPのnamespaceとuseについて

プログラミングについて勉強したいと思う期間はまちまちで、モチベーションがいつも途切れ途切れになり、いっこうに基礎が固まり切れていないです。

CakePHPを勉強していてControllerのコードに書いてある、namespace App\Controllerってなんだっけ?と疑問に感じました。

たしか、他のプログラミング言語でも勉強したはず(^▽^;)

名前が衝突しないように、ディレクトリ構成のように名前を分ける仕組みだったような…とうる覚えの記憶しかなかったので、今回はnamespaceについて復習しました。

公式ドキュメントより

いざ復習してみたら、ここで自分なりにまとめる必要性もないようなことだったので、公式ドキュメントのリンクだけはっておきます。(←本当は書くのがめんどくさかっただけ)

PHP: 名前空間 - Manual

 

合わせて読みたい

公式ドキュメントの後に以下の記事を読み、理解が深まったように感じたので、そちらのリンクも紹介しておきます。

【PHP超入門】名前空間(namespace・use)について

 

CakePHPの例をもとにすると

<?php
// src/Controller/ArticlesController.php

namespace App\Controller;

class ArticlesController extends AppController
{
}
CMS チュートリアル - Articles コントローラーの作成 - 3.10

たとえば、CakePHPの公式ドキュメントのチュートリアルに上のようなコードが書いてありました。このとき、私はnamespace App\Controller;というのは当初何なのか?と疑問に感じていました。

でも、これは名前空間として書かれたものだとわかりました。名前空間は自由に名前をつけることができるので、App\Controllerという名前のもとコントローラーを定義するようにするということでしょう。

※どうやらCakePHPではすべてのクラスが名前空間のもと定義されているようで、AppControllerの場合、App\Controllerという名前空間に配置してあり、そのクラスを継承してコントローラを定義しなければならないため、そのコントローラの名前空間はAppControllerと同じ名前空間を指定するのが基本みたいです。※

突然出てきたAppに戸惑いましたが自由に名前を決められるということから、ようやくその意味がわかりました。初めはControllerというnamespaceはまだわかるが、Appというnamespaceはなんなのか?とよくわからないでいました。

 

そして、同じくCakePHPの公式ドキュメントに、こんなコードが載っていました。

namespace App\Controller;

use Cake\Controller\Controller;

class AppController extends Controller
{
}
コントローラー - 3.10

このコードに書かれているuse Cake\Controller\Controleer;という部分はいったい何なのでしょうか?

use演算子はインポートとエイリアスを意味します。その意味を表すものとして、phpの公式ドキュメントには以下のよう例が示されています。

namespace foo; 
use My\Full\Classname as Another; 
// これは use My\Full\NSname as NSname と同じです 
use My\Full\NSname; 
// グローバルクラスをインポートします 
use ArrayObject; 
// 関数をインポートします (PHP 5.6+) 
use function My\Full\functionName; 
// 関数のエイリアスを定義します (PHP 5.6+) 
use function My\Full\functionName as func; 
// 定数をインポートします (PHP 5.6+) 
use const My\Full\CONSTANT; $obj = new namespace\Another; 
// foo\Another クラスのオブジェクトのインスタンスを作成します 
$obj = new Another; // My\Full\Classname クラスのオブジェクトのインスタンスを作成します 
NSname\subns\func(); // My\Full\NSname\subns\func 関数をコールします 
$a = new ArrayObject(array(1)); // ArrayObject クラスのオブジェクトのインスタンスを作成します // "use ArrayObject" がなければ、foo\ArrayObject クラスのオブジェクトのインスタンスを作成することになります 
func(); // 関数 My\Full\functionName を呼びます echo CONSTANT; // 定数 My\Full\CONSTANT の値を表示します
PHP: 名前空間の使用法: エイリアス/インポート - Manual

この例を見ると、use Cake\Controller\Controller;というのは

// これは use My\Full\NSname as NSname と同じです
use My\Full\NSname;

この説明から、Cake\Controller\ControllerというものをControllerという名前で使うという意味でしょうか。

そもそも、CakePHPのControllerクラスというのはCake\Controller\Controllerという名前空間に位置しています。

アプリ作成時に基本的に作る必要のあるControllerというのは、AppControllerというものを継承し、それぞれのControllerを定義する必要があります。以下のコードはAppControllerクラスを定義するコードのようです。

namespace App\Controller;

use Cake\Controller\Controller;

class AppController extends Controller
{
}
コントローラー - 3.10

したがって、このコードに書かれているAppControllerというクラスというのは、Cake\Controller\Controllerというクラスを継承し作られているものだということがわかります。正式名称はCake\Controller\Controllerという名前ではありますが、それをuseで名前を短く使えるようにしているので、Controllerという名前でCake\Controller\Controllerというものを指定したことになります。

 

すべてを完璧に理解するのは難しいですが、PHPの勉強も少しずつ基礎を固めつつ、CakePHPのことをもっと知れるようにしていきたいです。

コメント

タイトルとURLをコピーしました