PHP/名前空間

PHP/名前空間

なぜ名前空間が必要なのか?

PHPは 5.3 より前までは名前空間が存在しなかった。そのため関数などはすべてグローバルになってしまい、 同名の関数を作ることができなかった。

そこで、対処としては関数の名前をやたら長くするということで回避されてきた。

名前空間を作ることで、対象を限定、指定してコード中で使うことができるようになる。

名前空間を作る

名前空間の命名規約

文法的にはなんでもいいようだが、規約が PSR-0 によって標準化されている。そしてこの PSR-0 に加えさらに、PSR-4 で新たに項目が追加されている。

まず Vendor の名前が来る。作者名前とか会社名とかそういうやつ。

次に、フレームワークやライブラリ名が来る。

それ以降は自由で、最後の末端にクラス名となる場合がある。

名前空間中のアンダースコアは オートローダー によってディレクトリ区切りに変換されるらしく、使うなら注意が必要だろう

ということで、アプリケーションの ルート が hoge だった場合に taro さんが piyo ライブラリを作って、そこに FugaFuga クラスを作るとすると その名前空間は

この hoge アプリケーション中では、

taro\piyo\a\b\c\FugaFuga

という感じでアクセスできる。

上記の区切り記号は、Linux や Mac 等の Unix 系ではバックスラッシュ、Windows では¥マーク(円の通貨記号)で表現される。

名前空間とディレクトリ(フォルダ)とファイル

基本的に名前空間とディレクトリ(フォルダ)構成とファイル名は関係無いようなのだが、一致させるのが普通である。

つまりさっきのこの名前空間を持つクラスは、このような位置に実装されることになる。

/home/unko/document/workspace/hoge/vendor/taro/piyo/a/b/c/FugaFuga.php

名前空間を使う

require

PHP では前から外部の対象を読み込む時に require が使われていていて、この対象を操作することで名前の衝突を避けていた。

名前空間が解ったとしても、対象そのものが読めないのなら意味が無いので、まず require で対象を読み込むことにする。

require はアクセスされた PHP ファイル起点にパス計算されるので、このようにとりあえず読み込む

require_once __DIR__ . '/vendor/taro/piyo/a/b/c/FugaFuga.php';

e

ではおもむろに class FugaFuga を使ってみる。使えない。

Class 'FugaFuga' not found

では呼び出してみる

taro\piyo\a\b\c\FugaFuga::hello();

これで呼び出すことができた。しかしコレでは呼び出しが長すぎて長い名前を使っていることとあまり変わりが無い

use

use を使うことでそこで使う名前空間の範囲を限定することができる

Java の import のようにこれを読み込みますという宣言ではなくて、 use というのはこれをこの名前で使います宣言になる。

require_once __DIR__ . '/vendor/taro/piyo/a/b/c/FugaFuga.php';
use taro\piyo\a\b\c\FugaFuga;
FugaFuga::hello();

この場合なら、現状読み込まれている名前空間のうちの taro\piyo\a\b\c 内の FugaFuga クラスをこのファイルでは FugaFuga と扱いますということになる。

このような考え方なので、Java の import のようなワイルドカードで全部という動きは無い。

オートローダー

名前空間とともによく語られるオートーローダーという単語だが、別に PHP の文法上そういうモノがあるわけでなく、 それを読んどけばよい具合に全部 require してくれるコードの全般をこう言う。

Composer などを使うと生成される、autoload.php というやつである。

php/basic/namespace.txt · 最終更新: 2019-07-08 18:51 by ore