PHP の require パスと include パスに関連する問題の概要

WBOY
リリース: 2016-06-13 12:12:02
オリジナル
830 人が閲覧しました

Summary of require and include path issues in PHP

1 Absolute paths, relative paths and undetermined paths

Relative paths

Relative paths refer to paths starting with ., such as

<code>./a/a.php (相对当前目录)    ../common.inc.php (相对上级目录),</code>
ログイン後にコピー

Absolute path

Absolute path is a path starting with / or a similar drive letter like C:/ under Windows. The full path can uniquely determine the final address of the file without any参照パス。 例如

<code>/apache/wwwroot/site/a/a.phpc:/wwwroot/site/a/a.php</code>
ログイン後にコピー

未确定路径

凡是不以 . 或者 / 开头、也不是windows下 盘符:/ 开头的路径,例如

<code>a/a.php  common.inc.php,</code>
ログイン後にコピー

开始以为这也是相对路径,但在php的include/require包含机制中,这种类型的路径跟以 . 开头的相对路径处理是完全不同的。 less './a.php'を要求し、「a.php」が異なります!

Let's analyze the processing methods of these three types of include paths: First, remember a conclusion: if the include path is a relative path or an absolute path, it will not go to include_path (include_path defined php.ini 環境変数で指定するか、プログラムで set_include_path(...) を使用してファイルを見つけます。

Test environment description

Note: The following discussion and conclusion are based on this environment: Assumption A=http://www.xxx.com/app/test/ a.php では、以下の説明は A への直接アクセスの場合であることを再度強調します。

2. 相対パス:

インクルード解決では、相対パスには 参照ディレクトリ が必要です。 🎜> 含まれるネストレベルの数に関係なく、この参照ディレクトリは、プログラム実行エントリファイルが配置されているディレクトリ です。

Example 1

<code>A中定义  require './b/b.php';  // 则B=[SITE]/app/test/b/b.phpB中定义  require './c.php';    // 则C=[SITE]/app/test/c.php 不是[SITE]/app/test/b/c.php</code>
ログイン後にコピー
Example 2

<code>A中定义  require './b/b.php';  // 则B=[SITE]/app/test/b/b.php B中定义  require '../c.php';   // 则C=[SITE]/app/c.php  不是 [SITE]/app/test/c.php </code>
ログイン後にコピー
Example 3

<code>A中定义  require '../b.php';   //则B=[SITE]/app/b.php B中定义  require '../c.php';   //则C=[SITE]/app/c.php  不是 [SITE]/c.php </code>
ログイン後にコピー
Example 4:

<code>A中定义  require '../b.php';   // 则B=[SITE]/app/b.php B中定义  require './c/c.php';  / /则C=[SITE]/app/test/c/c.php  不是 [SITE]/app/c/c.php </code>
ログイン後にコピー
Example 5

<code>A中定义  require '../inc/b.php';  // 则B=[SITE]/app/inc/b.php B中定义  require './c/c.php';     // 则C还是=[SITE]/app/test/c/c.php  不是 [SITE]/app/inc/c/c.php </code>
ログイン後にコピー
Example 6

<code>A中定义  require '../inc/b.php';  // 则B=[SITE]/app/inc/b.php B中定义  require './c.php';       // 则C=[SITE]/app/test/c.php  不是 [SITE]/app/inc/c.php </code>
ログイン後にコピー
3. Absolute path

The absolute path is relatively simple and not easy to cause confusion and errors. require|インクルードは、ディスク上の対応する1つのファイルです。

<code>require '/wwwroot/xxx.com/app/test/b.php';    // Linux中require 'c:/wwwroot/xxx.com/app/test/b.php';  // windows中</code>
ログイン後にコピー
dirname(__FILE__) is also calculated as a directory in the form of an absolute path, but please note that __FILE

__ is a Magic constants. No matter when, it is equivalent to writing this The absolute path of the PHP file where the statement is located, so dirname(__FILE__) always points to the absolute path of the PHP file where the statement is written. It has nothing to do with whether this file is included and他のファイルによって使用されます。

例1

<code>A中定义  require '../b.php';                  // 则B=[SITE]/app/b.phpB中定义  require dirname(__FILE__).'/c.php';  // 则B=[SITE]/app/c.php</code>
ログイン後にコピー
例2

<code>A中定义  require '../inc/b.php';              // 则B=[SITE]/app/inc/b.phpB中定义  require dirname(__FILE__).'/c.php';  // 则B=[SITE]/app/inc/c.php 始终跟B在同一个目录</code>
ログイン後にコピー

結論:bがaに含まれて使用されるか、直接アクセスできるか

<code>B如果 require dirname(__FILE__).'/c.php';    // 则始终引用到跟B在同一个目录中的 c.php文件; B如果 require dirname(__FILE__).'/../c.php'; // 则始终引用到B文件所在目录的父目录中的 c.php文件; B如果 require dirname(__FILE__).'/c/c.php';  // 则始终引用到B文件所在目录的c子目录中的 c.php文件;</code>
ログイン後にコピー
4. 未決定のパス

まず、include_path で定義されたインクルード ディレクトリを使用して [未決定のパス] を 1 つずつ結合します。見つからない場合は、インクルードは正常に終了します。 executes the require statement. The directory where the file is located is used to concatenate the full path composed of [undetermined path] to find the file. If the file exists, the include file exits successfully, otherwise it means that the included file does not存在するとエラーが発生します。 未定のパスは混乱しやすく、推奨されません。

5. Solution

Since the "reference directory" in the "relative path" of

is the directory where the execution entry file is located , "undetermined" Paths are also easy to confuse, so the best solution is to use "absolute path" ; For example, the content of b.php is as follows, no matter where require b.php is based on the path of b.php Come to require c.php's

<code>$dir = dirname(__FILE__);require($dir . '../c.php');</code>
ログイン後にコピー
or define a general function import.php, set it to "automatically import files in advance", and make the following configuration in php .ini

<code>更改配置项(必须)auto_prepend_file = "C:\xampp\htdocs\auto_prepend_file.php"更改配置项(可选)allow_url_include = On</code>
ログイン後にコピー
import.php の内容は次のとおりです

<code>function import($path) {        $old_dir = getcwd();        // 保存原“参照目录”    chdir(dirname(__FILE__));    // 将“参照目录”更改为当前脚本的绝对路径    require_once($path);    chdir($old_dir);            // 改回原“参照目录”}</code>
ログイン後にコピー
このように、import() 関数を使用してファイルの数に関係なく要求できます。 levels of "reference directories" it contains, it is the current file

Reference article: PHP Experience summary on require and include path issues

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート