Exemples de code de problèmes de chemin require et include en php

怪我咯
Libérer: 2023-03-12 20:24:01
original
1440 Les gens l'ont consulté

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 (相对上级目录),
Copier après la connexion

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
Copier après la connexion

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,
Copier après la connexion

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);            // 改回原“参照目录”
}
Copier après la connexion

这样就可以使用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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!