Maison  >  Article  >  développement back-end  >  Explication détaillée de PHP nécessite et inclut la commande

Explication détaillée de PHP nécessite et inclut la commande

黄舟
黄舟original
2017-06-25 10:55:071238parcourir

Dans les projets Web à grande échelle, include_path est la base d'une conception modulaire (bien sûr, il existe également de nombreuses conceptions basées sur le chargement automatique, ce qui n'affecte pas cet article ) Discussion), mais précisément à cause de include_path, nous rencontrons souvent des problèmes apparemment "étranges" causés par le fait de ne pas trouver le bon fichier.

Il y a aussi les questions suivantes :

Comment est-ce que include_path fonctionne ?

Quel est l'ordre s'il y a plusieurs include_paths ?

Dans quelles circonstances include_path ne fonctionne-t-il pas ?

Aujourd'hui, je vais donner un aperçu complet introduction à ce problème, en commençant par un exemple

La structure de répertoires suivante :

  root    
  ├ 1.php    
  ├ 3.php    
  └ subdir         
  ├ 2.php          
  └ 3.php

est en 1. En php :

Le code est le suivant :

<?php 
ini_set("include_path", ".:path_to_subdir"); 
require
("2.php"); 
?>


Et en 2.php :

<?php 
require("3.php"); 
?>

Et en 3 dans le répertoire racine .php affiche "root", et 3.php dans le répertoire subdir affiche "subdir" ;

Maintenant, ma question se pose :
1 Lors de l'exécution dans le répertoire racine 1.php, quelle sortie obtiendrez-vous ?
2. Exécutez 1.php dans le répertoire supérieur sous subdir, quel résultat obtiendrez-vous ?
3. Lors de l'annulation du chemin du répertoire actuel dans include_path (c'est-à-dire include_path ="path_to_subdir"), quel sera le résultat des deux questions ci-dessus ?
include_path en PHP
Lorsque PHP rencontre l'instruction require(_once)/include(_once), tout d'abord, le jugement suivant sera effectué : le chemin du fichier est-il faut-il inclure un chemin absolu ?

Si oui, incluez-le directement et terminez
Sinon, entrez une autre logique (après plusieurs appels, la macro Après expansion, entrez _php_stream_fopen_with_path) pour rechercher ce fichier <.>

Ensuite, dans _php_stream_fopen_with_path, le jugement suivant sera effectué :

Le chemin du fichier à inclure est-il un chemin relatif (sous la forme de ./file, . ./dir/file, utilisez plutôt le "chemin relatif du répertoire" ci-dessous) ?

Si tel est le cas, ignorez la logique de include_path et analysez directement le chemin relatif (introduit séparément plus tard)

formera une liste de répertoires de candidats basée sur include_path et le chemin du fichier d'exécution actuel. Par exemple, pour l'exemple de l'article précédent, la liste de candidats suivante sera formée

Le code est le suivant. :

".:path_to_subdir:current_script_dir
Puis, en partant de la tête de liste candidate, sortir un chemin dans la liste candidate selon DEFAULT_DIR_SEPARATOR (l'environnement de cet article est ":"), puis mettre le chemin vers être inclus Le nom du fichier est ajouté à ce chemin et un essai est effectué. Si l'inclusion est réussie, revenez, sinon continuez avec le chemin candidat suivant

Jusqu'à présent, nous pouvons répondre aux 3 questions que j'ai posées au début. 🎜>1 . Parce qu'il est exécuté dans le répertoire racine, lorsque 2.php est inclus dans 1.php, le deuxième chemin candidat de include_path fonctionne (path_to_subdir), path_to_subdir/2.php est trouvé et 2.php est inclus lorsque. 3.php est utilisé, le répertoire de travail actuel est sous racine, donc lorsque 3.php est inclus, le fichier correspondant se trouve dans le premier chemin candidat de include_path "." (répertoire de travail actuel), donc la sortie est obtenue. "root".
2. Identique à 1, sauf que le chemin actuel est subdir, donc la sortie est "subdir".
3 Comme il n'y a pas de include_path dans le chemin actuel, il est exécuté à la racine. répertoire Lorsque 2.php inclut 3.php, path_to_subdir joue un rôle, donc que ce soit dans la racine ou dans le sous-répertoire, vous obtiendrez la sortie de "subdir"
Et si vous effacez include_path dans 2.php,


<?php 
ini_set("include_path", &#39;&#39;); 
require("3.php"); 
?>
Ensuite, current_script_dir prendra effet, et à ce moment-là, current_script_dir est le chemin de 2.php, vous obtiendrez donc toujours la sortie de "subdir"


Chemin relatif du répertoire.
Lors de l'utilisation d'un chemin relatif de répertoire, le point de base du chemin relatif est toujours le répertoire de travail actuel
Pour illustrer la situation sous un chemin relatif de répertoire, examinons à nouveau la structure des répertoires ci-dessus. , mais 1.php devient :


<?php 
ini_set("include_path", "/"); 
require("./subdir/2.php"); ?>
2.php devient :


<?php 
require("./3.php"); 
?>
S'il est exécuté dans le répertoire racine, recherchez 3. php dans 2.php sera recherché dans le chemin relatif du répertoire courant, donc le résultat obtenu est "root", et si 1.php du répertoire de niveau supérieur est exécuté sous le sous-répertoire (php -f .. /1. php), se fermera anormalement car "./subdir/2.php" est introuvable sous le sous-répertoire


Postscript
1 Parce que include_path et le chemin relatif sont utilisés dans ce cas. sera lié au nombre de recherches. Dans le pire des cas, si vous avez 10 chemins d'inclusion, cela peut prendre jusqu'à 11 tentatives pour trouver le fichier à inclure. Il est donc préférable d'utiliser des chemins absolus. chemins absolus.
2. Étant donné que le répertoire de base du chemin relatif du répertoire est toujours le chemin de travail actuel, si vous souhaitez l'utiliser, il doit être lié au chemin de déploiement réel, il est donc rarement utilisé dans la pratique (de bien sûr, cela peut également être fait à l'aide du module chdir).
3. Dans la conception d'un système modulaire, le chemin de déploiement du module doit généralement être obtenu dans le module (
dirname
(FILE). Après php5.3, les constantes DIR sont fournies) utilisant ainsi des chemins absolus.

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!

Déclaration:
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