19

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

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

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

index.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

index.php:

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

f1.php:

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

f2.php: 空白

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

では、パス解決の背後にある秘密は何ですか?

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

4

5 に答える 5

12

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

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

編集: 2 番目の例は、. (実際のディレクトリ) はインクルード パスにあります (エラー メッセージを参照してください)。

Edit2: 2 番目の例では、重要なポイントは次の行です。

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

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

'.:/usr/share/php:/usr/share/pear'フォールバックとして、「.」で始まるinclude_path ( ) で f2.php を見つけようとします。(これは、実際のファイルに相対的であり、インクルードするファイルではありません)。

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

于 2009-12-29T10:23:13.137 に答える
4

index.php を開くと、作業ディレクトリはこのファイルが存在するフォルダーに設定されます。また、含まれている f1.php 内では、この作業ディレクトリは変更されません。

次のように、現在インクルードされているファイルに対して相対的な絶対パスを使用して、ファイルをインクルードできます。

require_once(dirname(__FILE__).'/../../test/file.php')

ただし、これらのファイルにクラスが含まれている場合は、オートローダーの使用を検討してください。

于 2009-12-29T10:15:09.250 に答える
0

サーバーの PHP 構成でopen_basedir設定が有効になっているようです。これにより、ディレクトリ構造の上位のフォルダーにファイルを含める (そして開く) ことができなくなります (つまり、../ を使用してフォルダー構造を上に移動することはできません)。

于 2009-12-29T10:21:23.307 に答える
0

あなたの古い構造の正常性

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

それ以外の

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

動作するはずです。私の知る限り、phpは最初のスクリプトからパスを取得します

于 2009-12-29T10:04:50.080 に答える