require_once ではインクルードパスの解決はどのように機能しますか? 質問する

require_once ではインクルードパスの解決はどのように機能しますか? 質問する

PHP で Web アプリを作成していたとき、奇妙な状況に遭遇しました。問題を説明するために、次の構造の Web アプリを考えてみましょう。

/
    index.php
    f1/
        f1.php
    f2/
        f2.php

これらのファイルの内容:

インデックス.php:

<?php require_once("f1/f1.php"); ?>

f1.php:

<?php require_once("../f2/f2.php"); ?>

f2.php: 空白

ブラウザで index.php を開こうとすると、次のエラーが表示されます。

Warning: require_once(../f2/f2.php) [function.require-once]: 
failed to open stream: No such file or directory in /var/www/reqtest/f1/f1.php on line 2
Fatal error: require_once() [function.require]: 
Failed opening required '../f2/f2.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/reqtest/f1/f1.php on line 2

何か明らかに見落としている点はありますか? PHP ではインクルード パスはどのように機能しますか?


この質問をする前に、私は実験して調べてみようとしました。次のような別のテストを設定しました。

/
    index.php
    f1/
        f1.php
        f2.php

インデックス.php:

<?php require_once("f1/f1.php"); ?>

f1.php:

<?php require_once("f2.php"); ?>

f2.php: 空白

驚いたことに(そして完全に混乱しましたが)、これはうまくいきました!

では、パス解決の秘密は何でしょうか?

追伸:私は見たこの質問しかし、ここで述べた 2 番目のケースにはまだ答えていません。

ベストアンサー1

別のファイルをインクルードする場合、作業ディレクトリはインクルードしたファイルと同じ場所に残ります。

あなたの例は意図したとおりに動作しています。

編集:2 番目の例は、. (実際のディレクトリ) がインクルード パス内にあるため機能します (エラー メッセージを参照)。

編集2:2 番目の例では、注目すべき重要なポイントは次の行です。

<?php require_once("f2.php"); ?>

最初は現在の作業ディレクトリ ( /var/www/req_path_test) を検索しますが、f2.php は見つかりません。

フォールバックとして、include_path('.:/usr/share/php:/usr/share/pear')内のf2.phpを「.」(実際のファイルではなく、含む1つ)。

したがって、「./f2.php」は機能し、require は失敗しません。

おすすめ記事