2009-09-26 5 views
2

Suppose qu'il n'y a pas de cache d'octets.Que se passe-t-il d'abord en PHP, en incluant ou en analysant?

Est-ce que le my_func sera analysé avant qu'un & b soit inclus, ou après?

$x=my_func(); 

//a.php and b.php are **very** heavy scripts 
include ('a.php'); 
include ('b.php'); 


//my_func makes the browser use it's cached version of the page. 
function my_func(){ 
    //send caching headers 
    //header(....); 
    exit; 
} 

Répondre

1

Pourquoi ne pas essayer?

Par exemple, vous pourriez avoir un premier fichier, appelé temp.php, qui contient ceci:

<?php 

$a = my_func(); 

include 'temp-2.php'; 

function my_func() { 
    die; 
} 

Et le second fichier, temp-2.php, qui contiendrait ceci:

<?php 

sleep(5); 

Lorsque vous appelez temp.php à partir de votre navigateur Web, combien de temps faut-il pour charger la page? C'est presque instantané? Ou cela prend-il 5 secondes?

Dans le premier cas, la fonction est appelée avant que temp-2.php soit incluse. ... Et, après avoir essayé: cela ne prend qu'un instant - ce qui signifie que le second fichier n'est pas inclus, lorsqu'il y a un dé ou une sortie dans la fonction.


EDIT après le commentaire: Oh, désolé, je ne comprenais pas vraiment, je suppose que la question, :-(

Voici un autre essai: le temp.php contient encore ceci:

<?php 

$a = my_func(); 

include 'temp-2.php'; 

function my_func() { 
    die; 
} 

Mais le fichier temp-2.php contient maintenant seulement que:

<?php 

, 

Qui, oui, vous obtiendra une erreur d'analyse si PHP essaye d'analyser ce fichier.


Si vous appelez temp.php de votre problème, il ne semble pas être un problème du tout: rien ne s'affiche, et il n'y a pas d'erreur d'analyse syntaxique.

Maintenant, si vous commentez la ligne « die » à l'intérieur de la fonction my_func et essayez d'appeler temp.php à nouveau dans votre navigateur, vous obtenez:

Parse error: syntax error, unexpected ',' in /home/squale/developpement/tests/temp/temp-2.php on line 3 

Ce qui indique qu'il ya une erreur Parse si PHP tente d'analyser ce deuxième fichier. Donc, la première fois, la fonction a été appelée avant que PHP n'essaye réellement d'analyser le second fichier.

Espérons que cette question soit meilleure, cette fois-ci :-)

+0

Je fais la distinction entre l'analyse et la course. Donc, dans mon cas, si les fichiers sont inclus et analysés, puis exécutés seulement après l'appel de my_func, ce n'est pas bon pour moi (et votre test ne le prouve pas ou ne le prouve pas), comme dans ma vraie application, un .php & b.php sont une énorme liste de fichiers, plusieurs mégas ... –

+0

@Itay: Je viens d'éditer ma réponse avec un second exemple, qui, j'espère, répondra mieux à votre question. –

+0

Bien que j'ai reçu une réponse directe d'Adam Wright, j'aime mieux la cause de la preuve. Merci. –

10

Oui, my_func sera appelé avant l'exécution des includes. Ils sont effectivement un mécanisme de «temps d'exécution», plutôt que d'analyser le temps. Vous pouvez même inclure conditionnellement, en les enveloppant dans le contrôle de flux.

+0

SO, juste pour que ça soit clair pour moi. Les inclusions se produisent dans la "phase d'exécution" et ** pas ** dans la phase d'analyse? –

+0

Oui - les inclus sont inclus lors de l'exécution. –

0

Fondamentalement, la commande sera correcte. Considérez:

a.php:

<?php echo "A\n"; ?> 

b.php:

<?php echo "B\n"; ?> 

c.php:

<?php 
my_func(); 

include 'a.php'; 
include 'b.php'; 

function my_func() { 
    echo "C\n"; 
} 
?> 

La sortie sera:

C 
A 
B 

Mais le changement c.php à:

<?php 
my_func(); 

include 'a.php'; 

function my_func() { 
    include 'b.php'; 
    echo "C\n"; 
} 
?> 

et les changements de sortie à:

B 
C 
A 
+0

que se passe-t-il si la fonction my_func est dans a.php ou b.php? – andho

+0

Répondre à ma question Erreur fatale: Appel à la fonction non définie my_func() dans D: \ Program Files \ xampp5 \ htdocs \ test \ test2.php à la ligne 2 – andho

+0

Si vous obtenez une erreur fatale, vous avez probablement une faute de frappe quelque part parce que cela fonctionne bien. – cletus

Questions connexes