Soyez prudent concernant l'utilisation de require_once et les répertoires relatifs en PHP

黄舟
Libérer: 2023-03-11 12:08:01
original
1935 Les gens l'ont consulté

wwwroot //Le chemin absolu vers le répertoire racine du site Web est : F:/wwwroot

-- dossier_a // Dossier A

  file_a_a.php
   file_a_b.php
   file_a_c.php
Copier après la connexion

-- dossier_b // Dossier B

file_b_a.php
   file_b_b.php
   file_b_c.php
Copier après la connexion

-- index.php

********************************* ***** *******************************

Cette hiérarchie de répertoires est déjà très claire :

wwwroot Comme répertoire racine, il y a le fichier index.php et deux dossiers dossier_a et dossier_b ci-dessous

Ces deux dossiers ont respectivement 3 fichiers php

Regardons d'abord le contenu du fichier index.php ; 🎜>Yiju Tutorial Network >

Tutoriel Php
<?php
     require_once("folder_a/file_a_a.php");
     echo "文件folder_a_a.php被包含成功";
?>
Copier après la connexion
>>

FAQ

>
<?php
     require_once("../folder_b/file_b_a.php");
     $x = new X();
     $x.printInfo();
?>
Copier après la connexion

Soyez prudent lors de l'utilisation de php require_once et répertoires relatifs

<?php
     class X{
          function printInfo(){
               echo &#39;success;
          }
     }
?>
Copier après la connexion
www.111cn.net Mise à jour : 2012-06-25 Éditeur : xiewen Source : Réimpression

L'article présente l'utilisation de require_once que vous rencontrez souvent dans le développement PHP Friends in. le besoin peut s'y référer. wwwroot //Le chemin absolu vers le répertoire racine du site Web est : F:/wwwroot

-- dossier_a // Dossier A

file_a_a.php

fichier_a_b .php

fichier_a_c.php

-- dossier_b // Dossier B

fichier_b_a.php

fichier_b_b.php

file_b_c .php

-- index.php

****************************** **** *******************************

La hiérarchie des répertoires est déjà très claire :

wwwroot est le répertoire racine. Il y a le fichier index.php et deux dossiers dossier_a et dossier_b ci-dessous

Ces deux dossiers ont respectivement 3 fichiers php

Regardons l'index. Fichier .php en premier. Contenu :

Le code est le suivant Copier le code

require_once("folder_a/file_a_a.php");

echo "Le fichier dossier_a_a. php a été inclus avec succès";

?>

Regardez le contenu du fichier dossier_a/dossier_a_a.php :

Le code est le suivant Copier le code

require_once("../folder_b/file_b_a.php");

$x = new X();

$x .printInfo();

?>

Enfin, jetons un œil au contenu du dossier_b Fichier /folder_b_a.php :

Le code est le suivant Copier le code

classe X{

fonction printInfo(){

echo 'success; 🎜>

}

?>

 

ok Si je lance floder_a/file_a_a.php directement maintenant

alors il affichera : success

Si je lance index.php

sous wwwroot, une erreur sera signalée car le

fichier contenant

:file_b_a.php

est introuvable. Mais si j'exécute tous Add dirname(FILE).'/'

à require_once(), alors que vous exécutiez file_a_a.php ou index.php, vous pouvez sortir normalement.

*************** ******************************* *****************

Problème :

La première fois que j'ai utilisé un chemin relatif, une erreur s'est donc produite lorsque j'ai répété l'inclusionLa deuxième fois, j'ai utilisé un chemin absolu, donc il n'y a pas eu d'erreur. Mais je suis toujours un peu confus :

J'ai d'abord analysé les raisons d'erreur suivantes lors de l'utilisation de chemins relatifs :

Je lance index.php, il peut trouver le répertoire dossier_a et file_a_a dans ce répertoire .php, il copie donc le contenu de dossier_a/fichier_a_a.php sur la première ligne de index.php (la ligne contenant l'instruction. ), puis continue de s'exécuter (c'est-à-dire exécute le contenu inclus), donc à ce moment-là, il est égal à Il faut exécuter require_once('../folder_b/file_b_a.php') dans file_a_a.php dans index.php ; Il recherche ce chemin de fichier (file_b_a.php) en fonction de l'emplacement actuel de index.php, mais bien sûr, il est introuvable, donc ça s'est mal passé

Mais n'est-ce pas pareil quand. J'utilise des chemins absolus ? Mais pourquoi ça ne se passe pas mal ? Peut-être que cette phrase est un peu déroutante pour tout le monde, laissez-moi vous expliquer en détail (selon le programme L'ordre de passage sera expliqué

Le programme). exécute index.php en premier (notez que j'ai ajouté dirname (FILE) à ce moment-là, donc le chemin actuel est absolu),

index.php s'exécute en premier Une phrase de code : require_once(dirname(FILE).' /'.'folder_a/file_a_a.php');

dirname(FILE) est f:/wwwroot/, donc le chemin contenu dans ce code est :

f:/wwwroot/folder_a /file_a_a.php

Ce chemin est correct, donc il n'y a pas de problème, n'est-ce pas ?

ok La première étape est terminée correctement

Ensuite, il copie le code dans file_a_a. php à cet emplacement dans index.php :

puis continue de s'exécuter : il s'agit d'exécuter tout le code de file_a_a.php dans index.php, voyons donc quel code il exécute ?

<?php
     require_once(dirname(FILE).&#39;/&#39;."../folder_b/file_b_a.php");
     $x = new X();
     $x.printInfo();
?>
Copier après la connexion

对就是这些,需要注意的是,这些代码已经被复制到了index.php,也就是说,现在index.php的内容实际上就变成了:

<?php
     require_once(dirname(FILE).&#39;/&#39;."../folder_b/file_b_a.php");
     $x = new X();
     $x.printInfo();
     echo "文件folder_a_a.php被包含成功";
?>
Copier après la connexion

我们来看个注意事项

假设有如下三个文件, c.php a.php b.php 对应的存放目录为:localhost/ localhost/ localhost/demo

c.php
require_once("a.php");
require_once("demo/b.php");
B::demo();a.php
class A
{
}
Copier après la connexion

b.php的内容比较有意思,因为它自己要继承 CLASS A 所以自己把a.php也引入进去了

require_once("../a.php");
class B extends A
{
    public static function demo()
    {
    echo "xx";
    }
}
Copier après la connexion

执行localhost/c.php 系统报错,报错信息如下
Warning: require_once(../a.php) [function.require-once]: failed to open stream: No such file or directory in F:wwwdemob.php on line 2
Fatal error: require_once() [function.require]: Failed opening required '../a.php' (include_path='.;C:php5pear') in F:wwwdemob.php on line 2但是,惊奇的发现,如果去掉b.php里面的require_once语句,执行正常,那么一定是require_once语句定义多了吗?原因就是Class A重定义了两次?可是不会啊。如果我只在c.php里面加require_once(‘a.php’);这条语句,哪怕我写两遍也是没错的,那到底是咋回事呢?
原因就是,b.php定义的目录和c.php执行文件的目录层级不一致,导致在c.php里面require_once语句有两条。使其相当于

require_once("a.php");
require_once("../a.php");
class B extends A
{
    public static function demo()
    {
    echo "xx";
    }
}
B::demo();
Copier après la connexion

原因找到了,因为在c.php里面,其相对目录 “..”就是 c.php的上一层了,导致文件找不到报错。
所以,我们的结论是,在 PHP 里面,使用require_once的时候,存在不同层级关系,且有相对目录的使用那么一定要谨慎,小心。


require_once很简单用但在使用时大家尽量使用绝对路径了。

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!