2010-04-21 4 views
13

Simple question: Le champ d'application de require_once est-il global?Quelle est la portée de require_once en PHP?

Par exemple:

<?PHP 

require_once('baz.php'); 

// do some stuff 
foo ($bar); 

function foo($bar) { 
    require_once('baz.php'); 
    // do different stuff 
} 

?> 

Lorsque foo est appelé, -t-elle réanalysera baz.php? Ou dépend-t-il du fichier déjà requis du fichier php principal (analogue à l'appel de require_once deux fois consécutivement pour le même fichier include)?

J'ai vu ce fil avant, mais il n'a pas tout à fait répondu à la question:

Should require_once "some file.php" ; appear anywhere but the top of the file?

Merci pour votre aide!

Répondre

6

require_once() repose essentiellement sur le fichier physique pour déterminer s'il a été inclus ou non. Donc, ce n'est pas tellement le contexte que vous appelez require_once(), c'est si ce fichier physique a déjà été requis ou non.

Dans votre code ci-dessus, votre fonction foo() ne ré-analyserait pas baz.php, car il s'agira du même fichier que celui précédemment inclus en haut.

Toutefois, vous obtiendrez des résultats différents selon que vous les avez inclus dans foo() ou que vous les avez inclus en haut, car la portée s'appliquera lorsque require_once() réussira.

+0

Super - merci à tous pour vos réponses! – TMG

2

Pour répondre spécifiquement à votre question, la deuxième fois que vous appelez require_once sur ce fichier, il ne fera rien, car il est déjà inclus.

Si votre include a des fonctions etc., alors vous auriez des problèmes y compris dans une fonction de toute façon, donc la portée n'est pas pertinente. Si seules les variables sont définies ou traitées, vous pouvez simplement utiliser require au lieu de require_once si vous souhaitez qu'il soit à nouveau inclus, redéfinissant ainsi les variables de votre périmètre.

5

Ce n'est pas le cas. Le suivi require_once s'applique aux fonctions internes. Cependant, les scripts suivants produisent une erreur:

a.php

<?php 
require_once('b.php'); 
function f() { require_once('b.php'); echo "inside function f;"; } 
?> 

b.php

<?php 
f(); 
?> 

parce que la fonction f() ne sont pas pré-défini à b.php.

Questions connexes