2013-03-11 9 views
12

Mi chiedo sull'ordine di interpretare le dichiarazioni di funzione da parte del motore PHP. Non so perché qualche volta PHP mostri Call to andefined error fatal function e talvolta l'interprete veda la funzione senza problemi.Flusso di lavoro PHP - ordine di esecuzione delle funzioni

Supponiamo il mio codice è:

echo theRest(4,3); 

function theRest($a, $b) 
{ 
    return $a % $b; 
} 

Vedi che la funzione viene dichiarata dopo l'invocazione e questo funziona corretta. Significa che il PHP legge l'intero file prima dell'interpretazione?

Un altro esempio:

echo theRest(4,3); 

include('test2.php'); 

test2.php

function theRest($a, $b) 
{ 
    return $a % $b; 
} 

Qui sto ottenendo l'errore fatale: Call to undefined function therest(). Perché?

+0

cancellato il mio post precedente perché il primo ha fatto il lavoro sulla mia macchina. (Ho avuto 1) Spero che qualcuno possa fornire anche la risposta. –

+0

Dai un'occhiata a questa [Domanda] (http://stackoverflow.com/questions/5762017/php-include-not-working-function-not-being-included) potrebbe essere un problema simile? E, a proposito, PHP ti dà -anche- errore, se metti semplicemente il comando 'include ('test2.php');' riga -prima- quella funzione? Sai, solo per provarlo :) –

+0

Questo è stato menzionato su [YourLanguageSucks] (https://wiki.theory.org/YourLanguageSucks#PHP_sucks_because :) pagina wiki –

risposta

6

means that PHP is reading whole file before interpretation?

sì, PHP analizza un file alla volta. E "include" è un'affermazione, non qualcosa che accade in fase di compilazione, quindi il file incluso viene analizzato non appena viene raggiunta la riga di inclusione. Le definizioni delle funzioni invece non sono dichiarazioni e vengono elaborate in fase di compilazione, eccetto quando si trovano all'interno di una struttura di controllo. Questo è il motivo per cui le seguenti opere:

if (!function_exists('ucwords')) { 
    function ucwords($str) { 
     //... 
    } 
} 

Così ogni funzione e definizione di classe in un file che è stato analizzato e risiede al di fuori di una struttura di controllo è immediatamente disponibile.

7

Quando il PHP legge un file, lo compila in bytecode (tempo di compilazione), quindi lo esegue (tempo di esecuzione/tempo di esecuzione).

Le dichiarazioni di funzioni incondizionate vengono lette in fase di compilazione, in modo che le funzioni siano già note al momento dell'esecuzione del codice.

Include, al contrario, vengono eseguiti al momento dell'esecuzione, quindi le funzioni definite nel file di inclusione non sono disponibili prima che venga eseguito lo stesso include(). Include non può essere eseguito in fase di compilazione, poiché l'argomento può essere dinamico (ad esempio include $path_to_file;) e dipende dall'impostazione include_path che può essere modificata dal codice.

The documentation è molto chiaro su questo:

Functions need not be defined before they are referenced, except when a function is conditionally defined as shown in the two examples below.

Quando si utilizza include(), la funzione è di fatto condizionalmente definito (per esempio, include "foo.php"; possono includere un file o l'altro a seconda dell'impostazione include_path).

+0

Grazie ragazzi. Immagino che ciò significhi che non avrò più spostato una funzione "incondizionata" sotto e all'esterno di un'istruzione condizionale per spremere quel tempo di elaborazione inesistente. –

0

In questo codice:

echo theRest(4,3); 

function theRest($a, $b) 
{ 
    return $a % $b; 
} 

Il tutto viene compilato prima e poi il codice viene eseguito. Tuttavia, in questo codice:

echo theRest(4,3); 

include('test2.php'); 

Il include dichiarazione stessa viene compilato ma non eseguito fino a quando il codice è raggiunto il punto di esecuzione.

Posizionamento del include prima del punto in cui è correzioni riferimento è:

include('test2.php'); 

echo theRest(4,3); 
Problemi correlati