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

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

ただいまの
回答率

88.33%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,707

kitsunekonkon

score 29

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

A.classファイル

require_once B.class.php

B.classファイル

require_once A.class.php

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/11 16:23

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

    キャンセル

  • 2016/06/11 16:29

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

    キャンセル

  • 2016/06/11 16:36

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

    キャンセル

+2

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

今回の場合

a.php

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

b.php

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

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

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

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

include_once 命令は、スクリプトの実行時に指定 したファイルを読み込み評価します。この動作は、 include 命令と似ていますが、ファイルからのコー ドが既に読み込まれている場合は、再度読み込まれないという重要な違い があります。また、include_once は TRUE を返します。その名が示す通り、ファイルは一度しか読み込まれません。
include_once は、スクリプトの実行時に同じファイ ルが複数回読み込まれ、評価される可能性がある場合に、関数の再定義や 変数値の再代入といった問題を回避するために一回だけ読み込ませるため に使用します。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/11 16:21

    回答いただきありがとうございます。require_onceを使用した場合、一度しか読み込みが行われず、ループはしないということは理解できました。

    その場合、このように相互に依存するファイルをお互いに読み込むような設計でソースを書くということもできるということでしょうか?

    下に回答いただいた方も設計ミスである場合が多いとのことでしたが、作り方はまずいとしてもそのようにお互いに依存するようなソースもかけてしまうということでしょうか。

    キャンセル

  • 2016/06/11 16: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
    でそれぞれ定数やグローバル変数を定義していて、それがシステム全体で使用される必要があり、すべてのファイルから読み込まれないといけない状態とか?これも普通はしませんが。

    キャンセル

  • 2016/06/11 16:36

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

    キャンセル

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

  • ただいまの回答率 88.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る