Cet article présente principalement l'explication détaillée de require et inclut les problèmes de chemin en PHP. Il est très détaillé. Les amis dans le besoin peuvent se référer à
1 Chemin absolu, relatif. chemin et chemin non spécifié Déterminer le chemin
Chemin relatif
Le chemin relatif fait référence au chemin commençant par ., par exemple,
Le code est le suivant :
./a/a.php (相对当前目录) ../common.inc.php (相对上级目录),
Chemin absolu
Le chemin absolu est un chemin commençant par / ou une lettre de lecteur similaire comme C:/ sous Windows. Le chemin complet peut être unique sans aucun chemin de référence. Déterminez l'emplacement final du fichier. Par exemple, le code
est le suivant :
/apache/wwwroot/site/a/a.php c:/wwwroot/site/a/a.php
Chemin indéterminé
Tout ce qui ne commence pas par ou / n'est pas un . Lettre de lecteur Windows :/Le chemin au début, tel que
, le code est le suivant :
a/a.php common.inc.php,
Au début, je pensais que c'était aussi un chemin relatif, mais dans l'include de PHP /require mécanisme d'inclusion, ce type de chemin commence par .La gestion des chemins relatifs est complètement différente. require './a.php' et require 'a.php' sont différents !
Ce qui suit analyse les méthodes de traitement de ces trois types de chemins d'inclusion : Tout d'abord, rappelons une conclusion : si le chemin d'inclusion est un chemin relatif ou un chemin absolu, il n'ira pas vers include_path (la variable d'environnement include_path défini dans php.ini, ou utilisez set_include_path(...) paramètre) pour trouver le fichier dans le programme.
Description de l'environnement de test
Remarque : la discussion et la conclusion suivantes sont basées sur cet environnement : Supposons que A=http://www.xxx.com/app/test/a.php, soulignez encore une fois La discussion suivante concerne le cas d’un accès direct à A.
2. Chemin relatif :
Le chemin relatif nécessite un répertoire de référence pour déterminer le chemin final du fichier dans l'analyse d'inclusion, quel que soit le nombre de niveaux d'imbrication inclus. le répertoire de référence est le programme Exécuter le répertoire où se trouve le fichier d'entrée .
Exemple 1
A définit require './b/b.php'; // Puis B=[SITE]/app/test/b/b.php
B Définition require './c.php'; // Alors C=[SITE]/app/test/c.php n'est pas [SITE]/app/test/b/c.php
Exemple 2
Défini dans A require './b/b.php'; // Puis B=[SITE]/app/test/b/b.php
Défini dans B require '../c. '; // Alors C=[SITE]/app/c.php n'est pas [SITE]/app/test/c.php
Exemple 3
A nécessite '.. /b .php'; //Puis B=[SITE]/app/b.php
B nécessite '../c.php' //Puis C=[SITE]/app/c.php Pas [SITE]; /c.php
Exemple 4 :
défini dans A require '../b.php'; // Puis B=[SITE]/app/b.php
Défini en B require './c/c.php'; // Alors C=[SITE]/app/test/c/c.php n'est pas [SITE]/app/c/c.php
Exemple 5
Défini dans A require '../inc/b.php'; // Alors B=[SITE]/app/inc/b.php
Défini dans B require ' ./c /c.php'; // Alors C toujours =[SITE]/app/test/c/c.php Pas [SITE]/app/inc/c/c.php
Exemple 6
Défini dans A require '../inc/b.php'; // Puis B=[SITE]/app/inc/b.php
Défini dans B require './c.php '/ / Alors C=[SITE]/app/test/c.php n'est pas [SITE]/app/inc/c.php
Chemin absolu
Les chemins absolus sont relativement simples et moins susceptibles de provoquer des confusions et des erreurs. require|inclue correspond aux fichiers sur le disque.
require '/wwwroot/xxx.com/app/test/b.php'; // Sous Linux
require 'c:/wwwroot/xxx.com/app/test/b.php' ; // Sous Windows,
dirname(FILE) est également calculé comme un répertoire sous la forme d'un chemin absolu, mais veuillez noter que FILE est une constante magique, qui est égale au php qui écrit cette instruction à tout moment. Le chemin absolu où se trouve le fichier, donc dirname(FILE) pointe toujours vers le chemin absolu du fichier php où cette instruction est écrite, et n'a rien à voir avec le fait que le fichier soit inclus et utilisé. par d'autres fichiers.
Exemple 1
Le '../b.php' obligatoire est défini dans A ; // Ensuite, B=[SITE]/app/b.php
Require dirname( est défini dans B FILE).'/c.php'; // Alors B=[SITE]/app/c.php
Exemple 2
A définit require '../inc/b .php'; // Alors B=[SITE]/app/inc/b.php
B nécessite dirname(FILE).'/c.php'; c.php est toujours dans le même répertoire que B
Conclusion : peu importe si B est inclus et utilisé par A ou directement accessible
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文件了,无论包含多少级“参照目录”都是当前文件
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!