phpで外部ファイルを使用する方法は2種類ある。(require,includeでrequireの方がよく見かけるし、更に言うとrequire_onceの方がよく見かける。)
使用する外部ファイルの中でどの機能を使用するかを指定できるのがuse。
require
ファイルの読み込みに使う。
require "ファイルのパス";
とrequire("ファイルのパス");
どっちでもいい。
requireで指定するのはphpファイルそのもの。
require "lib/test2.php";
再読込みが行われて、変数などが再定義されると困る場合は、require_onceを使う。要するに安全だからという理由でよく使われているよ。
ファイルが読み込めないとエラーになる。
include
ファイルの読み込みに使う。
includeは、指定したファイルを読み込むという点では、requireと同じ。ファイルが読み込めなかった場合は、警告を出すのみで、処理は継続する。include_onceを使用すると、既に読み込まれている場合は再読込みを行わない。用途はrequire_onceと同じ。
https://sussan-po.com/2017/08/25/php-use-require-include/
名前空間
同一ファイル名の衝突回避のために使う。イメージとしては名前を長くして被らないようにするイメージ。
namespace 名前空間名{}で囲うように定義したほうが分かりやすいのでよい。
namespace 名前空間名{}を使う場合、名前空間の外に命令文を記述することはできないので注意。
PHPでは名前空間がメソッド呼び出し等で重複した場合japan\sato\japan\sato\getGreeting()
を呼び出していると認識されエラーになってしまう。C#では省略できますと言われるだけだったから注意。
ただしecho \japan\sato\getGreeting();
のようにjapanの前に\が付くと相対的ではなくフルパスのようになるため名前空間で自動で前方を補われることはなく、エラーにもならない。
まあ基本的にそんな風に記述することはないと思うが一応メモ
<?php
namespace japan\sato;
require_once 'sato.php';
#これはエラーになる
echo japan\sato\getGreeting();
#これはエラーにならない
echo \japan\sato\getGreeting();
もし名前空間を定義しないとグローバル名前空間に属すことになるが、
グローバル名前空間であっても同じ名前空間に同じ名前のクラス名、関数などを定義することができない点は変わらない。
use
使用する名前空間やクラスや関数を指定するときに使うもの。
名前空間のおかげで同じ名前のファイルや関数が区別できるようになり便利になった。だが名前空間の分クラス名が長くなったともいえる。毎度呼び出しで記述する文字数が増えてそれは面倒だ。。それを解決してくれるのがuse。useを使って名前空間を省略したりできる。
あくまでも使うファイルがある状態でさらに、使用する名前空間やクラスや関数を指定するときに使うものなのでrequireで使用するファイルを読み込む処理は必要である。
以下のパターンが一番使いそう。requireで使用するファイルを読み込むこと。
require "ファイル名"
use 名前空間 as エイリアス
名前空間までしか指定しないなら使いやすいのはエイリアスパターンだと思う(まだエアプ)
use asia\japan\kanto as area;
area\○○で使う。useを使ったからと言って完全に省略はできない。
use asia\japan\kanto
ではkanto\○○で使う。こっちはインポートパターンらしいが、クラスや関数を使用するといったエイリアスを使うと逆に混乱しそうなパターンで使うものだろう。名前空間までの指定であればエイリアスに軍配が上がると思われる(まだまだエアプ)
useで楽に使用するクラスや関数を指定することも可能。関数やクラスをまとめてインポート。
use asia\japan\kanto\tokyo\{
pref, bird, flower
};
他にもuseで指定できるものはある。
useで関数を指定する
use function 完全修飾形式の関数名;
useで定数を指定する
use const 完全修飾形式の定数名;
個人メモ
phpではC#で「.」で区切っていたものが「\」で区切られている。
PHPで定数を定義するにはconstとdefine関数を使う2種類の方法があり、define関数は名前空間の影響を受けない。具体的にはよくわからないのがLaravelのデフォルトで作成されるファイルで使っていたのでそのソースを解読するときに調べる。
参考資料
https://qiita.com/7968/items/1e5c61128fa495358c1f
https://remotestance.com/blog/3064/
https://techacademy.jp/magazine/12283
https://sussan-po.com/2017/08/25/php-use-require-include/