0

PHPinclude()およびrequire()関数を使用して別のファイルをインクルードするファイルをインクルードする場合、2 番目のファイルの PWD (相対参照) はinclude()、元のスクリプトの場所 (Apache によって呼び出されたスタック内の最初のスクリプト) のディレクトリであり、現行ファイル。その背後にある設計上の決定は何ですか?また、ユースケースは何ですか?

たとえば、 で定義された一般的なデータベース接続クラスが~/public_html/classes/database.php、その構成データ (ユーザー名、パスワード) を の Web ルートから格納するとします~/config.php。データベース構成クラスの作成者は、相対ファイル名で構成ファイルを論理的に呼び出します../../config.phpdatabase.phpただし、PWD はファイルのものではなく、それを含むファイルのものであるため、これは期待どおりに機能~/public_html/index.phpしません~/public_html/someDir/somePage.php

で現在のファイルのディレクトリを取得することで、これを回避することができますdirname(__FILE__)。ただし、元のスクリプトの場所を基準にしたいrequire()、または相対的な使用例を 1 つも思いつきません。include()そのままのユースケースは何ですか?

4

2 に答える 2

1

関数include()とハンドルの相対パスは、、、などの他のファイルアクセス関数とrequire()同じです。fopen()unlink()mkdir()

スクリプトの場所に関係なく、パスは常にPWDを基準にしています。

次の例を考慮に入れてください。

/home/foo/index.php

require_once('lib/maketest.php');

/home/foo/lib/maketest.php

mkdir('test');

これにより、ディレクトリ/ home / foo / testが作成され、 / home / foo / lib/testは作成されません


スクリプトがどこにあるかに関係なく、bashスクリプトmkdir testもディレクトリを作成するため、これが選択されたことを想像でき$PWD/testます。

include()他のファイルアクセス機能と同じロジックに従うことは理にかなっています。次のコードを検討してください。

if (file_exists('config.php')) include('config.php');

のパスがPWDinclude()に相対的で__DIR__あり、パスがfile_exists()PWDにある場合、上記のコードは期待どおりに機能しません。

于 2013-03-22T22:47:53.893 に答える
1

PWD は Print Working Directory の略です。現在の作業ディレクトリは CWD と略されます。
CWD はコードの実行中に変更される可能性があり、PHP は必ずしもローカル ファイル パスからのコードを含める必要はありません。

すでにご存知のように、__FILE__一緒に調べることdirname()が問題の正しい解決策です。また、作業ディレクトリが同じままであることに依存するのではなく、アプリケーションのルート パスを使用して定数を定義し、それをコード全体で使用する必要があります。
CWD は、すべての状況でスクリプトの開始点のパスになるわけではありません。

于 2013-03-22T23:17:22.997 に答える