今回はPHPの仕様としてrequireを一回どこかで入れれば他のファイルはあえてrequireを使わなくてもいいのか疑問があったので調査してみました。
もう少し具体的に言うとa.phpでc.phpをrequireするだけでb.phpはc.phpをrequireなしで使えるの?という疑問を検証します。
実験準備
検証のためにa,b,cのファイルをWEBサーバ内の同じディレクトリに用意します。
#c.phpを読み込んだ後インスタンス化
#そのあとb.phpを読み込んで返却してもらった文字列を表示する。
<html><h1>
<?php
require "c.php";
$c = new c;
echo require "b.php";?>
</h1></html>
#a.phpから呼び出されたらc.phpに定義してあるcクラスをインスタンス化する。
#b.phpではc.phpをrequireせずとも問題なく実行できるか確認
#実行できれば成功を返却
<?php
$c = new c;
return "成功";
?>
#インスタンス化されたいだけなので空のクラスで十分
<?php
class c{}
実験結果
役者は揃いました。
早速ブラウザでa.phpにアクセスしてみましょう。
\うまくいっていれば成功と表示されるはずです。/
結論
a.phpでc.phpをrequireするだけでb.phpはc.phpをrequireなしで使えます!
地味に気になったけど調べても出てこなかったのでやっとわかってすっきりしました!
※2022/4/23追記
コメントにてrequireにもスコープがあり必ずしも一度requireすればどこでも使えるというわけではないことをご指摘していただきました。
指摘内容について確認した記事を投稿したのでそちらも合わせてご確認ください。
おまけ
a.phpでc.phpのrequireを消してb.phpとc.phpはそのままで再度ブラウザでa.phpにアクセスすると・・・
<html><h1><?php
//require "c.php";
//$c = new c;
echo require "b.php";
?></h1></html>
b.phpの2行目c.phpを使うタイミングで当然ですがエラーになっちゃいます。
<?php
$c = new c;
return "成功";
?>