2010-10-04 3 views
1

Je veux juste confirmer quelque chose car ma compréhension a été ébranlée par un test que j'ai fait sur un autre serveur que je m'attendais à ce que quelque chose fonctionne et ce n'est pas le cas. S'il vous plaît voir la question dans le code ci-dessous.Appels inclus et fonctions

<?php 

function xyz(){ 
} 

include("test.php"); 
/* 
* A function in the above include checks if the function abc function_exists(). 
* Will it return a true? What about for xyz? 
*/ 

function abc(){ 
} 

?> 

Merci à tous

Répondre

3

Vous pouvez penser à inclure comme copier et coller le fichier entier dans où l'instruction include est.
Alors, vraiment, vous êtes à la recherche:

function xyz(){ 
} 

var_dump(function_exists('xyz')); 
var_dump(function_exists('abc')); 

function abc(){ 
} 

qui reviennent à la fois vrai, comme l'a démontré here (par exemple: les fonctions définies dans un script sont accessibles à tout moment).

Voir la réponse de nikic pour les exceptions à cela.

+0

Merci de confirmer, c'est ainsi que je l'ai compris.Il doit y avoir quelque chose d'autre qui ne va pas avec mon code sur l'autre serveur, une certaine configuration ... De toute façon, ce problème est aussi bien résolu. :) – Abs

0

Le script est analysé de haut en bas. Donc, quand test.php est inclus, xyz existera, mais abc ne le sera pas. Whups, je pensais à autre chose, mais NullUserException est juste. Toutes les fonctions qui sont sur la page chargée existeront selon function_exists().

+0

Qu'avez-vous pensé exactement? – NullUserException

0

abc existe partout où je vérifie son existence. C'est probablement dû au fait que le moteur PHP peut analyser le code et créer toutes les fonctions avant d'ajouter autre chose: il lit probablement toutes les lignes avec "function foobar()", puis exécute le reste du code

0

Il semble qu'une fonction soit trouvée comme existant même si elle est déclarée après le code de vérification.

<?php 

echo function_exists('abc').PHP_EOL; 
echo function_exists('xyz').PHP_EOL; 

function xyz(){ 
} 

function abc(){ 
} 

?> 

Je ne sais pas pourquoi cela se produit, mais il peut être parce que le code PHP est compilé dans un format interne avant de l'exécuter. Toutes les fonctions seront donc créées après la compilation et avant l'exécution.

Cordialement, Alin

2

En PHP fonction n'a pas besoin d'être déclarés avant qu'il ne soit utilisé ou référencé. Il y a une seule exception à ceci: Si la fonction est définie conditionnellement (dans une instruction if), la fonction n'est disponible qu'après l'exécution de l'instruction if. (Mais cela est logique parce que PHP ne peut pas savoir si le if sera ou ne sera pas évaluer.)

Voir la manual:

fonctions ne doivent pas être définies avant ils sont référencés, sauf lorsqu'un La fonction est conditionnellement définie comme montrée dans les deux exemples ci-dessous.

Lorsqu'une fonction est définie d'une manière conditionnelle , par exemple les deux exemples illustrés. Sa définition doit être traitée avant d'être appelée.

+0

Cela ne tomberait pas dans ce cas particulier: 'if (function_exists ('xyz')) {' car il fait un appel à une fonction qui existe depuis sa construction. – Abs

+0

Ça marchera;) Si vous faites référence à une fonction sous conditions, ça va. Seulement si vous définissez la fonction dans une condition ('if (false) {function fooBar() {}}') cela ne fonctionne pas. – NikiC