🙆

PHPでrequire_onceでは無くuseをよく見かけるようになったので違いを確認してみた

2021/04/14に公開

概要

最近 PHPのコードを見ていると「use」が使われているのを見かけます。
外部からの読み込み(インポート)に「require_once」ではなく「use」が使われている風に見えていたので「require_once」と「use」の使い方について確認してみました。

require_once

昔はライブラリなど外部ファイルや読み出すのに「require_once」を使うのが当たり前でした。
require_onceは、ファイルがすでに読み込まれているかどうかチェックして、 すでに読み込まれている場合はファイルを読み込まないという動きをします。
開発の規模が大きくなってくると他人が作ったコードが増えて多重読み出しが行われるようになり読み込み先のファイルと同じファイルを読み込みして意図しない多重読み込みによるエラーもrequire_onceで防止する事ができます。

名前空間

但し、require_onceを使っても読み込み先のファイルのどこかで同じ名前の関数が定義されているとエラーになっていました。

a.phpとb.phpを「require_once」で読み込んだ場合に
両方に同じ名前の関数があった場合にFatal errorが発生します。

PHP Fatal error:  Cannot redeclare ...

名前空間を利用する事で回避できます。

a.php
namespace a;

b.php
namespace b

として記述おけば、それぞれが違う名前空間に存在するため「Fatal error」にならずに実行できようになります。
ただし、呼び出すときに「a\aaa();」と名前空間を指定して関数を呼び出さないといけなくなります。
※同じ名前空間が存在する場合は関数の名前が重複するのと同様に「Fatal error」が発生します。

use について

useを使うことで名前空間の読み込み(インポート)と、名前空間に別名をつけることができるようになります。

//「a」という名前空間を「c」という別名で読み込みする
use a as c;

名前空間のおかげで同し名前の関数でも使い分ける事ができます。さらに、別名をつけることで長い名前空間でも短い名前で利用できるようになります。

まとめ

外部ファイルをフレームワーク側で読み込んでいたりautoloadなどを実装している事も多くrequire_onceを見かける回数が減っていたためuseが多用されている風に見えていましたが
require_onceとuseの両方を組み合わせて使っていくのが正しい使い方でした。

require_once(a,php);
use a as c;

1.require_onceで外部のファイルを読み込む
2.useで名前空間を読み込む(別名をつける)

なんとなく使えるのでスルーしがちですが、改めて確認してみると初歩的な発見に立ち戻る事ができました。

GitHubで編集を提案

Discussion