この記事では、主に require の詳細な説明と PHP のインクルードパスの問題について詳しく説明しています。必要な方は、
1 絶対パス、相対パス、および未決定のパス
相対パスを参照してください。
相対パスは、. で始まるパスを指します。たとえば、コードは次のとおりです:./a/a.php (相对当前目录) ../common.inc.php (相对上级目录),
絶対パス
絶対パスは、/ または Windows の C:/ または同様のドライブ文字で始まるパスです。フルパスは参照を必要としません。パスはファイルの最終アドレスを一意に決定できます。 たとえば、
コードは次のとおりです:/apache/wwwroot/site/a/a.php c:/wwwroot/site/a/a.php
未決定のパス
. または / で始まらないパス。たとえば、
コードは次のとおりです。以下の通りです:a/a.php common.inc.php,最初はこれも相対パスだと思いましたが、PHP の include/require メカニズムでは、このタイプのパスは で始まる相対パスとはまったく異なる方法で処理されます。 require './a.php' と require 'a.php' は異なります。 これら 3 種類のインクルード パスの処理方法を分析してみましょう: まず、結論を覚えておいてください。インクルード パスが相対パスまたは絶対パスの場合、include_path (php.ini で定義されている include_path 環境変数) には進みません。 、またはプログラム内で
set_include_path
(...) を使用してファイルを見つけます。 注: 以下の議論と結論はこの環境に基づいています: A=http://www.xxx.com/app/test/a.php と仮定します。次の議論が直接的なものであることを再度強調します。 A ケースにアクセスします。2. 相対パス:
インクルード解析では、ネストされたインクルードのレベルに関係なく、この参照ディレクトリがプログラムを実行するディレクトリになります。 エントリーファイルがあります。
例 1
B は require './c.php' を要求します / / その場合、C=[SITE]/app/test/c.php は [SITE]/app/test/b/c.php ではありません
例 2
B には '../c.php' が必要です // その場合 C=[SITE]/app/c.php ではありません [SITE ]/app/ test/c.php
例 3
B は require '.. /c.php'; //その場合、C=[SITE]/app/c.php は [SITE]/c.php ではありません
例 4:
B には './c/c.php' が必要です //C=[SITE]/app/test/c/c.php は [SITE]/app/c/c.php ではありません。
例 5
B で定義 require ' ./c/c.php '; // 次に C は =[SITE]/app/test/c/c.php Not [SITE]/app/inc/c/c.php
例 6
B の定義 require './c.php'; // 次に C=[SITE] /app/test/c.phpは [SITE]/app/inc/c.php
ではありません。 絶対パス
絶対パスは比較的単純であり、require|inclue はディスク ドキュメント内のパスに対応します。
require '/wwwroot/xxx.com/app/test/b.php'; // Linux の場合require 'c:/wwwroot/xxx.com/app/test/b.php' // Windows の場合
dirname
(FILE) も絶対パス形式のディレクトリとして計算されますが、FILE は Magic 定数であり、このステートメントが記述されている PHP ファイルの絶対パスと等しいことに注意してください。 dirname(FILE) も常にこのステートメントが記述される php ファイルの絶対パスを指し、そのファイルがインクルードされているかどうか、他のファイルによって使用されているかどうかとは関係がありません。
例 1
B は dirname(FILE).'/c.php'; を要求します。 B=[SITE]/app/c.php
例 2
結論: B が A に含まれるかどうかは関係ありません。直接アクセス
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文件;
4. 未确定路径
首先在逐一用include_path中定义的包含目录来拼接[未确定路径],找到存在的文件则包含成功退出,如果没有找到,则用执行require语句的php文件所在目录来拼接[未确定路径]组成的全路径去查找该文件,如果文件存在则包含成功退出,否则表示包含文件不存在,出错。 未确定路径比较容易搞混不建议使用。
5. 解决方案
由于“相对路径”中的“参照目录”是执行入口文件所在目录,“未确定”路径也比较容易混淆,因此最好的解决方法是使用“绝对路径”; 例如b.php的内容如下,无论在哪里require b.php都是以b.php的路径为参照来require c.php的
$dir = dirname(FILE);
require($dir . '../c.php');
或者定义一个通用函数 import.php,将其设置为“自动提前引入文件”,在php.ini做如下配置
更改配置项(必须)auto_prepend_file = "C:\xampp\htdocs\auto_prepend_file.php"
更改配置项(可选)allow_url_include = On
import.php内容如下
代码如下:
function import($path) { $old_dir = getcwd(); // 保存原“参照目录” chdir(dirname(FILE)); // 将“参照目录”更改为当前脚本的绝对路径 require_once($path); chdir($old_dir); // 改回原“参照目录” }
这样就可以使用import()函数来require文件了,无论包含多少级“参照目录”都是当前文件
以上がPHP での require パスと include パスの問題のコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。