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 は失敗しません。