回答:
これは、メインスクリプト(この場合はA.php)を基準にしています。include()
現在実行中のスクリプトにコードを挿入するだけです。
つまり、インクルードがどのファイルから呼び出されるかは重要ですか
番号。
あなたがしたい場合は作る事を、そしてB.phpに対する含ま行い、使用__FILE__
定数を(または__DIR__
PHP 5.2 IIRC以降)リテラル現在のファイルを常にポイントコードの行が置かれているということ。
include(dirname(__FILE__)."/C.PHP");
__DIR__
その正確な目的にも使用できます。
include(dirname(__FILE__)."/C.PHP");
のでinclude("C.PHP");
、十分です(はい!C.PHPはB.PHPと同じディレクトリに置くことができます)プロジェクトに2つのC.PHPファイルがある場合のみ失敗する可能性があります。
@ペッカは私をそこに連れて行きましたが、私が学んだことを共有したいだけです:
getcwd()
実行を開始したファイルが存在するディレクトリを返します。
dirname(__FILE__)
現在実行中のコードを含むファイルのディレクトリを返します。
これら2つの関数を使用すると、必要なものに対して相対的なインクルードパスをいつでも構築できます。
たとえば、b.phpとc.phpがディレクトリを共有している場合、b.phpは次のようにc.phpを含めることができます。
include(dirname(__FILE__).'/c.php');
b.phpがどこから呼び出されたかは関係ありません。
実際、これは相対パスを確立するための推奨される方法です。追加のコードは、ターゲットファイルを見つけるためにPHPがinclude_pathを反復する必要がないようにするためです。
出典:
インクルードパスが./
または../
で始まらない場合、例:
include 'C.php'; // precedence: include_path (which include '.' at first),
// then path of current `.php` file (i.e. `B.php`), then `.`.
インクルードパスが./
または../
で始まる場合、例:
include './C.php'; // relative to '.'
include '../C.php'; // also relative to '.'
.
又は..
上記ことに対するものであるgetcwd()
エントリのパスにそのデフォルト、.php
ファイル(すなわち、A.php
)。
PHP 5.4.3でテスト済み(ビルド日付:2012年5月8日00:47:34)。
(chdir()
の出力を変更できることにも注意してくださいgetcwd()
。)
chdir(__DIR__)
して問題を解決してくれてありがとう。
getcwd()
、デフォルトはエントリ.phpファイルのパスです[...] -必ずしもtrueであるとは限りません。コマンドラインでPHPを実行する場合getcwd()
、どの.php
ファイルを呼び出すかに関係なく、シェルの現在の作業ディレクトリを参照します。ただし、PHPがWebサーバー環境で実行されている場合、環境が現在の作業ディレクトリをエントリ.php
ファイルに初期化することは想像できます。Homebrewを介してインストールされたPHP 7.2.2を備えたmacOSでテストされています。
ペッカの受け入れられた答えは不完全であり、一般的な文脈では、誤解を招くものです。ファイルが相対パスとして提供されている場合、呼び出された言語構成include
は次の方法でファイルを検索します。
まず、でinclude_path
設定できる環境変数のパスを通過しますini_set
。これが失敗すると、呼び出し元のスクリプトの独自のディレクトリを検索しますdirname(__FILE__)
(__DIR__
php> = 5.3を使用)。これも失敗した場合は、作業ディレクトリのみを検索します!デフォルトでは、環境変数include_path
は.
現在の作業ディレクトリであるで始まることがわかります。それが現在の作業ディレクトリで最初に検索する唯一の理由です。http://php.net/manual/en/function.include.phpを参照してください。
ファイルは、指定されたファイルパス、または指定されていない場合は指定されたinclude_pathに基づいてインクルードされます。include_pathにファイルが見つからない場合、includeは最終的に、失敗する前に、呼び出し元のスクリプトの独自のディレクトリと現在の作業ディレクトリをチェックインします。
したがって、質問の最初の部分に対する正しい答えは、含まれている呼び出しスクリプトがどこにあるかが重要であることです。質問の最後の部分に対する答えは、Webサーバーコンテキストでの最初の作業ディレクトリは、呼び出されたスクリプトのディレクトリであり、PHPによって処理されている間、他のすべてを含むスクリプトです。コマンドラインコンテキストでは、phpがプロンプトで呼び出されたときの初期作業ディレクトリは、呼び出されたスクリプトが配置されているディレクトリとは限りません。現在の作業ディレクトリは、しかし、PHPの機能を実行時に変更することができますchdir
。http://php.net/manual/en/function.chdir.phpを参照してください。
この段落は、他の回答にコメントするために追加されます。信頼性include_path
が低いため、./path
またはなどのフルパスを使用することが望ましいと述べた人もいます__DIR__ . /path
。.
変更できるため、作業ディレクトリ自体に依存することは安全ではないと言う人もいます。ただし、環境値に依存する必要がある場合もあります。たとえばinclude_path
、現在の作業ディレクトリの前であっても、呼び出しスクリプトのディレクトリが最初に検索されるように、空に設定することができます。コードは既に外部ソースから定期的に記述および更新されている可能性があり__DIR__
、コードが更新されるたびにプレフィックスを再挿入したくない場合があります。
dirname(__FILE__)
(__DIR__)
、php> = 5.3を使用して、呼び出し元のスクリプトの独自のディレクトリを検索します。」どこに記載されていますか?私はあなたが間違っている願って、そしてPHPはないではない使用__FILE__
して__DIR__
のために、この目的は、そのよう速やかから「兄弟」スクリプトを含む破るシンボリックリンクのもの!:-o(幸いなことに、ここでは7.1の設定で問題なく動作するようです。)
短い答え:インクルードするスクリプトに関連します。
TFMはそれを正しく説明しています:
include_pathにファイルが見つからない場合、includeは呼び出しスクリプトのディレクトリと現在の作業ディレクトリをチェックインします
あれば、/app/main.phpは言うinclude("./inc.php")
ことがわかります/app/inc.php。
./は必須ではありませんが、include_pathの上の任意の依存関係を削除します。
誰かがで変更した場合に備えて、現在の作業ディレクトリでインクルードファイルを見つけることに依存しませんchdir()
。
./
で開始する場合、最初に呼び出し元のスクリプトのディレクトリまたは現在の作業ディレクトリを確認しますか?
./
。つまり、chdir( "/ app / other")はinclude("./inc.php")
失敗します。したがって、include("inc.php")
この場合は安全に使用してください。