requireやinclude時の階層の書き方について

このQ&Aのポイント
  • requireやinclude文を使用する際、同じ階層に複数の同名ファイルが存在する場合に起こる読み込みの挙動について説明します。
  • 具体的には、require文で指定するファイルのパスに関する問題と、dirname関数の役割について説明します。
  • また、別の階層に存在する同名ファイルを確実に1つだけ読み込む方法についても解説します。
回答を見る
  • ベストアンサー

requireやinclude時の階層の書き方

ずっと困ってます。よろしくお願いします。 読み込む大元のファイル名がindexだとして、その中にrequireを書くとします。 そこからrequireするファイルはindexと同階層にあるaフォルダにあるreq1.phpとします。 さらにreq1.phpからrequireするファイルがあり、同階層(aフォルダ内)にあるreq2.phpとします。 req2.phpはなぜかindexと同階層と、aフォルダ内の、計2カ所に同名の同じファイルがあるとします。 コードを書くと、 index内でrequire_once('a/req1.php'); req1.php内でrequire_once(dirname(__FILE__).'/req2.php'); としています。 この場合、読み込まれるreq2は、req1と同階層にあるものではなく、indexと同階層のものが読み込まれてしまいます。また、indexと同階層のreq2を消しておけば、req1と同階層に置いてあるreq2が読み込まれます。 この辺の挙動が、なぜこうなるのかを説明してください。 特に、 1.dirnameとの関係について 2.別階層に同名ファイルが複数存在の有無に関係なく、とにかくrequireする階層を確実に1つだけに限定する方法について(dirnameではうまくいかないような気がします) の2点は詳しく知りたいです。 よろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

お書きの通りの状況であれば、常に a/req2.php が読まれるはずです。 どこかに何らかの勘違いがあると思われます。もう一度見直しましょう。 なお、本筋とは多分関係ないですが、dirname(__FILE__) は、__DIR__ と書けます。

関連するQ&A

  • requireについて

    http://ドメイン/クラス名/メソッド名 というように、アドレスに従って、Apacheで集約ページ(index.php)にリライトし アドレスから該当クラスを生成、メソッド呼び出し。 という処理内容でフレームワークの勉強をしております。 http://ドメイン/Cart/add というアドレスを実行し、 index.php内で、 Cartクラスを生成し、Cartクラスのaddメソッドを実行させました。 ・Cartクラスのコンストラクタで、Requestクラスを生成する処理を書いているのですが なぜか自分の考えた通りのrequire文を、Cart.phpに記述するとエラーが出るのです。 【フォルダ・ファイル構成】 controllersフォルダ----Cart.php |-index.php |-Request.php Cart.phpは、Controllersフォルダに入っているので、Request.phpを呼び出す際には、 一階層上の【require_once '../Request.php'】だと思っていたのですが、 実行すると Request.php のソースが見つからないと出ます。 試しに【require_once 'Request.php'】に変更し、 実行すると、ファイルが読み込まれ、CartクラスのコンストラクタでRequestクラスが生成されます。 なぜ、【require_once 'Request.php'】にすると、クラスの生成が成功するのでしょうか? index.phpの中で、Cartクラスを生成しているから、 【Requst.phpは、index.htmlから見て】の require文を記述しないといけないのでしょうか? ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • include時の頭の良いパス指定について

    include時の頭の良いパス指定について 長い上に少々わかりにくい話ですが、includeする場合のパスについてです。 現在の構成は次のとおりです。 / ├inc/ │ ├file_a.class.php │ ├file_b.class.php │ ├file_c.class.php │ │ │ └require/ │   └require.php ├dir/ │└index.php │ └index.php 【/index.phpの中身】 <?php  require_once "./inc/require/require.php";  //その後いろいろ処理 ?> 【/inc/require/require.phpの中身】 <?php  require_once "./inc/file_a.class.php";  require_once "./inc/file_b.class.php";  require_once "./inc/file_c.class.php"; ?> 今回後付で、「/dir/index.php」を設置しました。 「/index.php」とほぼ処理は共通なので、「/dir/index.php」を次のように書いています。 【/index.phpの中身】 <?php  require_once "../index.php"; ?> しかし、この場合「/dir」以下からは、incまでの階層が異なるため、includeしても、 各クラスのファイルを読み込むことができず、 No such file or directory in require.php on line 2 のエラーが表示されてしまいます。 こういう場合、どういうパス指定をするのがいいのでしょうか。

    • ベストアンサー
    • PHP
  • レンタルサーバーにてのrequireがうまくいきません。

    毎度お世話になります。 質問させてください。 親フォルダ  |-外部用フォルダ  |  |-CSSフォルダ  |  |-PHPフォルダ  |     |-外部.php  |  |-index.php という構成でindex.phpから 「require_once "./外部用フォルダ/PHPフォルダ/外部.php";」 という記述でローカルなら呼び出せるのですが フリーレンタルサーバーにアップロードしてみるとうまく読み込みません。仕様だと思いますがサイトではエラー表示はありません。 ここのサイトをみて 「require(dirname(__FILE__) . "/./外部用フォルダ/PHPフォルダ/外部.php");」 というふうに書き換えたりしてみましたがやはりサイト上ではなにも表示されませんでした。 PHPを勉強し始めたばかりなのですが何か解決策を教えていただけないでしょうか? よろしくお願いします。 ローカル環境 WinXP SP2 + PHP5 サーバー環境 Linux + PHP5 です。

    • ベストアンサー
    • PHP
  • php インクルードincludeした時のパス

    phpにてincludeした時のパスで躓いています。 現在のツリーは以下の様になっています。 index.html common  ├header.html  ├footer.html  ├right.html  ├img   ├navi-home.jpg   ├navi-1.jpg  ├css   ├base.css salon  ├hair    ├kari     ├index.html     ├access     ├ ├index.html     ├menu     ├ ├index.html この中の../hair/kari/index.htmlの中に ../common/header.html及びfooter.htmlを <?php include_once(dirname(__FILE__).'/../../../common/header.html'); ?> にてインルードしています。(書き方あってます?dirname(__FILE__).いります?) つぎに../hair/kari/access/index.htmlの中にもインクルードします。 <?php include_once(dirname(__FILE__).'/../../../../common/header.html'); ?> という風に一つ下の階層なので../を付け足しました。 このようにページ毎にheaderまでの相対パスが違うので、そのページ毎にパスを書き換えていかなければいけないものなのでしょうか? また../始まりではなく/始まりでないと表示されません。 /始まりは絶対パスでしたっけ? この書き方は間違っているのでしょうか? そして最後に、 ../common/header.htmlの中の画像ファイルやリンクは <img src="/common/img/navi-home.jpg"> の様に書かないと、インクルードしたファイル側で表示されません。 これも同じように/始まりのこの書き方でいいのでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • require_onceについて

    MAMPを使用して開発しています。 MAMP/htdocsに入っているa.phpから同一階層にあるb.phpを呼びだそうと思い require_once('b.php'); と記述したのですが Warning: require_once(b.php): failed to open stream: No such file or directory in - on line 13 Fatal error: require_once(): Failed opening required 'b.php' (include_path='.:') in - on line 13 とエラーが表示されます。色々と試してみたもののうまくいかず。 アドバイスを宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 呼び出し先にさらに呼び出しがある場合について

    PHPバージョン5.2.4を使っています。 index.phpからdir1ディレクトリにあるfile1.phpをrequireして使いたいのですが、 file1.phpもdir1ディレクトリにあるfile2.phpをrequireしているので 次のような呼び出し方ならうまく作動するのですが、 [index.php] define('DIR', realpath(dirname(__FILE__))); require_once 'dir1/file1.php'; [dir1/file1.php] require_once DIR.'/file1.php'; [dir1/file2.php] print "file2表示"; 次のようにindex.phpをdir1ディレクトリに移動させて実行すると file1.phpのrequireでエラーが出てしまいます。 [dir1/index.php] define('DIR', realpath(dirname(__FILE__))); require_once 'dir1/file1.php'; このような呼び出し先の中にさらに別の呼び出しがある場合は どのように記述すればindex.php(実行するファイル)を 別のどんな場所に移動させても作動させることができるのでしょうか?

    • ベストアンサー
    • PHP
  • include,requireで外部URLの呼び込み

    include,requireのどちらでもいいのですが、別ドメイン或いは同ドメイン内における違う階層のファイルなど(例えば外部のhttp://www.ooxx.sample)を呼び込む際に、呼び込み先のリンクや画像パスが相対バスではうまくいきません。呼び込み先のリンク、画像パスを絶対URLにすれば問題ないと思いますが、作業が困難になるので避けたいです。 PHPでinclude,requireの使い方は向かないのでしょうか?或いは、他の方法で回避できる方法はないのでしょうか? (SSIやHTMLでインラインフレームみたいなことは使わない)

    • 締切済み
    • PHP
  • require_onceについて

    いつもお世話になっております。 超初級な質問で申し訳ないのですが困ってます。 下記のような4つのclassがあります。 A_Class------------ <?php require_once('Base_Class'); class A_Class extends Base_Class{} Base_Class------------------ <?php require_once('B_Class'); abstract class Base_Class { public function hoge (){ $b = new B_Class(); $b->hoge(); } } B_Class--------------------- <?php require_once('C_Class'); class B_Class{ public function hoge (){ $c = new C_Class(); } } C_Class--------------------- <?php require_once('Base_Class'); class C_Class extends Base_Class{} ほかのファイルからrequire_once('A_Class');をすると PHP Fatal error: Class 'Base_Class' not found in C_Class.class.php on line 2 となります。 Base_Classのrequire_once('B_Class');をクラス定義の下に書けば通るのですが、 できればrequire_onceは上部にそろえておきたいです。 require_onceを下に書かずに修正する方法がありましたらご教授お願いします。

    • 締切済み
    • PHP
  • requireができる場合とできない場合がある。

    あるページでrequireを使って 同じディレクトリ内の別のページを呼び出しています。 あるディレクトリ内には 0disp_e.php 呼び出したいファイル1 0disp.php  呼び出したいファイル2 0index.php 0disp.phpと0disp_e.phpを呼び出すファイル が、それぞれ入っています。   require("0disp_e.php"); だと0disp_e.phpを呼び出せるんですが、 require("0disp.php"); では、0disp.phpを呼び出すことはできません。 0disp.phpは failed to open stream: No such file or directory とでてしまうんです。 なぜか、同じ階層のはずが、 ひとつ下の階層になってしまっているんです。 ですから require("/フルパス/0disp.php"); で呼び出せば、問題なく呼び出すことはできます。 しかし 0disp_e.phpのほうは、 require("0disp_e.php"); のみでちゃんと同じディレクトリ内の データを呼び出せるんです。 この現象の原因が全く分かりません。 ファイル名にphpを誤動作させる文字とかが含まれていたんでしょうか・・・。 

    • ベストアンサー
    • PHP
  • include_pathについて。

    PHP 5.2以上のバージョンの話として質問をさせて頂きます。 (ローカルではWindows版XAMPPを使用。リモートはLinuxサーバー。) ----- <ファイルの位置関係> imgディレクトリ --- C.jpg (画像ファイル) mainディレクトリ --- A.php sub ディレクトリ --- funcディレクトリ --- B.php (img、main、subディレクトリは3つとも同階層) //------- (A.phpの記述) require_once '../sub/func/B.php'; //------- (B.phpの記述) echo '<img src="C.jpgのパス">'; // ←■画像Cを表示したい■ //★どう表示されるかテスト★ echo dirname(__FILE__) ;   //----- このような状況で、 A.phpにアクセスすると、★テスト★の所は、 ~/sub/func   //←のように表示される。 // つまりこれは、__FILE__ は、 // A.phpではなく、B.phpを指している。(?) と、このような時、B.phpの中で、 C画像の相対パスは、どう書いたらよろしいのでしょうか? A.phpから見た、C画像の相対パスで書いたらいい? それとも、B.phpから見たソレでしょうか? phpinfo()でinclude_pathの項目を調べると、 .:/usr/local/lib/php/~ のように書かれています。(デフォルトのままです。)

    • ベストアンサー
    • PHP

専門家に質問してみよう