質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

4644閲覧

2つのファイルをお互いrequireしあうことってありますか?

kitsunekonkon

総合スコア29

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/06/11 06:36

A.classというファイルとB.classというファイルがあって、お互いのファイルの先頭で

A.classファイル

php

1require_once B.class.php

B.classファイル

php

1require_once A.class.php

という記述がある既存のコードがあったのですが、お互いのクラスファイルを呼び出すことってあるんでしょうか?

なんかループしてしまうような気がするのですが、そもそもこのコードが間違っているのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

二重読み込みを防ぐための require**_once** です. 2回目以降は無視されます.

ただ,普通はそんなコード書かないと思います…
相互にクラスが依存しているのは設計ミスである場合が多いです.

投稿2016/06/11 07:06

mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kitsunekonkon

2016/06/11 07:23

相互にクラスが依存しているのは設計ミスである場合が多いとのことですが、実際に問題なく動いているため、ちょっと触るのが怖い部分もあるのですが、相互に依存するような書き方もやろうと思えばできてしまうということでしょうか?
mpyw

2016/06/11 07:29

はい,書こうと思えば書けます.互いのメソッドの中で相手側クラスのメソッドを直接呼べばそれだけで相互依存が成立します.
kitsunekonkon

2016/06/11 07:36

なるほど... やっかいなコードのメンテになりそうですね。。。 ありがとうございます!
guest

0

関数の挙動について疑問がある場合は、
PHPの公式マニュアル
PHPマニュアル
を確認し、実際に試すのが早くて確実です。

今回の場合

a.php

PHP

1<?php 2require_once("b.php"); 3echo "a";

b.php

PHP

1require_once("a.php"); 2echo "b";

二つのファイルを用意して実行するとループせずに実行されることが分かります。

ここから、下記の説明が示していることは

require_once 文は require とほぼ同じ意味ですが、 ファイルがすでに読み込まれているかどうかを PHP がチェックするという点が異なります。 すでに読み込まれている場合はそのファイルを読み込みません。_once の振る舞い、およびそれが _once なし版とどのように異なるのかについての情報は、 include_once のドキュメントを参照ください。

include_once 命令は、スクリプトの実行時に指定 したファイルを読み込み評価します。この動作は、 include 命令と似ていますが、ファイルからのコー ドが既に読み込まれている場合は、再度読み込まれないという重要な違い があります。また、include_once は TRUE を返します。その名が示す通り、ファイルは一度しか読み込まれません。

include_once は、スクリプトの実行時に同じファイ ルが複数回読み込まれ、評価される可能性がある場合に、関数の再定義や 変数値の再代入といった問題を回避するために一回だけ読み込ませるため に使用します。

require_once,include_onceによる読み込みは、自分自身も含めてその実行タイミングで一度しか読まれないことを意味する。
ということが分かります。

投稿2016/06/11 07:17

tanat

総合スコア18709

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kitsunekonkon

2016/06/11 07:21

回答いただきありがとうございます。require_onceを使用した場合、一度しか読み込みが行われず、ループはしないということは理解できました。 その場合、このように相互に依存するファイルをお互いに読み込むような設計でソースを書くということもできるということでしょうか? 下に回答いただいた方も設計ミスである場合が多いとのことでしたが、作り方はまずいとしてもそのようにお互いに依存するようなソースもかけてしまうということでしょうか。
tanat

2016/06/11 07:32

有効に使えるケースは思いつきませんが、書こうと思って書けなくはないです。 例えば、 a.class.phpに class baseB class a extends baseA を定義し b.class.php に class baseA class b extends baseB を定義すればお互いに依存するような形にはなりますね。 ほかに思いつくケースだと、 a.class.php b.class.php でそれぞれ定数やグローバル変数を定義していて、それがシステム全体で使用される必要があり、すべてのファイルから読み込まれないといけない状態とか?これも普通はしませんが。
kitsunekonkon

2016/06/11 07:36

丁寧にありがとうございます。通常は可読性の観点からもあまりやらないほうが良さそうですね。参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問