2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【検証】a.phpでc.phpをrequireするだけでb.phpはc.phpをrequireなしで使えるの?

Last updated at Posted at 2022-04-20

今回はPHPの仕様としてrequireを一回どこかで入れれば他のファイルはあえてrequireを使わなくてもいいのか疑問があったので調査してみました。
もう少し具体的に言うとa.phpでc.phpをrequireするだけでb.phpはc.phpをrequireなしで使えるの?という疑問を検証します。

実験準備

検証のためにa,b,cのファイルをWEBサーバ内の同じディレクトリに用意します。

a.php
#c.phpを読み込んだ後インスタンス化
#そのあとb.phpを読み込んで返却してもらった文字列を表示する。
<html><h1>
<?php
require "c.php";
$c = new c;
echo require "b.php";?>
</h1></html>
b.php
#a.phpから呼び出されたらc.phpに定義してあるcクラスをインスタンス化する。
#b.phpではc.phpをrequireせずとも問題なく実行できるか確認
#実行できれば成功を返却
<?php
$c = new c;
return "成功";
?>
c.php
#インスタンス化されたいだけなので空のクラスで十分
<?php
class c{}

実験結果

役者は揃いました。
早速ブラウザでa.phpにアクセスしてみましょう。
\うまくいっていれば成功と表示されるはずです。/
image.png

結論

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にアクセスすると・・・

a.php
<html><h1><?php
//require "c.php";
//$c = new c;
echo require "b.php";
?></h1></html>

image.png

b.phpの2行目c.phpを使うタイミングで当然ですがエラーになっちゃいます。

b.php
<?php
$c = new c;
return "成功";
?>
2
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?