0

PHPのドキュメントとここにある他の投稿から収集したものから、PHPのinclude(およびinclude_once)は次のことを行います。

ファイルは、指定されたファイルパスに基づいてインクルードされます。指定されていない場合は、include_pathが指定されます。ファイルがinclude_pathに見つからない場合、includeは、失敗する前に、呼び出し元のスクリプト自体のディレクトリと現在の作業ディレクトリを最終的にチェックインします。

特定のディレクトリに次の構造があります。

  • index.php
  • / dirA(a.phpとb.phpを含む)
  • / dirB(c.phpを含む)

index.phpから include_once "dirA/a.php"

a.php内で機能するものは次のとおりです。
include_once "b.php"
include_once "dirB/c.php"

a.php内から機能しないものは次のとおりです。
include_once "b.php"
include_once "../dirB/c.php"

私にとって不思議なことに、b.phpは「呼び出し元のスクリプト自体のディレクトリ」に関連して含まれていますが、c.phpは現在の作業ディレクトリ(index.phpを含むディレクトリ)に関連してのみ考慮されます。これは私には少し矛盾しているようです。PHPは、呼び出し元のスクリプトに関連するファイルをインクルードしますが、インクルードパスに含まれている場合はインクルードしません../-なぜですか? 親ディレクトリディレクティブが呼び出し元のスクリプトに対して機能しないのに、現在の作業ディレクトリに対しては機能するのはなぜですか?../ (注:cwdと比較してテストしましたが、クリーンに保つために上記の例にはそのファイルを含めませんでした。問題なく動作しました)

誰かがこれがなぜであるかについていくつかの光を当てることができますか? それはこのように機能する必要がありますか、それともこれはバグですか

4

2 に答える 2

2

PHP は、ファイルを探す方法が少し奇妙です。名前がスラッシュまたはドットで始まるファイルをインクルードすると、PHP は をinclude_path完全に無視します。ドットの場合、その名前はすべてを開始したスクリプト (つまり、Web サーバーが実行することを決定したスクリプト) に関連していると見なされます。

起動スクリプトではなく、インクルードされたスクリプトへの相対パスを指定する場合、本当に必要なのは、ファイルの完全な名前を指定する絶対インクルードです。これは、現在実行中のスクリプトの名前とディレクトリを反映する 定数__FILE__と定数を使用して簡単に実行できます。__DIR__

include __DIR__ . '/../dirB/c.php';

必要にinclude_path応じて、アプリのルートを含むように構成設定を設定し、それに関連するすべてのファイル名を指定することもできます。

于 2013-04-05T15:17:23.843 に答える
0

これは、最初にdirA/a.phpto をインクルードしたためですindex.php。したがって、これからは、index.phpすべてのインクルードが行われるベース ファイルになります。したがって、from を含める場合はc.php from からa.php行うのと同じです。index.php

で 1 レベル上を指定すると、間違った結果が得られるのはそのためです"../"。1 つ上のレベルを検索しますindex.phpが、何も見つかりません。

于 2013-03-16T20:38:09.387 に答える