PHP Call Call Placement

Considera questo snippet:

function f() { return 'hi'; } echo f(); 

Vs questo frammento:

 echo f(); function f() { return 'hi'; } 

Quando eseguo gli script, entrambi producono gli stessi risultati. È fantastico.

Ma la mia domanda è (e non sono riuscito a trovare una buona risposta o riferimento in nessuna delle mie ricerche), è giusto call la function prima che sia definita (cioè, da un'analisi sequenziale della prospettiva del file di script)?

Non voglio incorrere in problemi o deprecazioni in fondo alla strada se lascio la chiamata di function davanti al block di definizione della function nel mio file di script.

Dal manuale :

Le funzioni non devono essere definite prima di essere referenziate, tranne quando una function è definita condizionatamente come mostrato nei due esempi seguenti.

La possibilità di call (riferimento) una function prima che sia definita è una function intenzionale di PHP e non credo che sia necessario preoccuparsi che diventi deprecata.

Come osservazione, se è ansible scegliere di dichiarare la function prima o dopo, sarebbe opportuno dichiararla prima che venga utilizzata.

Nota: il codice seguente causerà un errore irreversibile perché la function verrà definita solo durante l'esecuzione.

 <?php echo helloWorld(); if(1){ function helloWorld() { return 'hello world'; } } ?> 

i passi del compilatore sono come questi:

  • Converte una sequenza di caratteri in token
  • Analizza i token per determinarne la struttura grammaticale.
  • Genera un codice byte in base al risultato delle analisi

Quindi il modo più semplice per capire questo è solo perché lo script non è multi-thread non significa che sia processato in una sola esecuzione in linea.

PHP Legge il tuo integer codice sorgente in token prima dell'esecuzione, in quanto ha il controllo sull'ordine in cui i token devono essere eseguiti per primi.

Prendi questo esempio

 while(true) { print '*'; } 

Ogni row è una sequenza di caratteri, quindi PHP interpnetworkingrà questo come

 if #T_IF #T_WHITESPACE ( #T_WHITESPACE true #T_STRING #T_WHITESPACE ) #T_WHITESPACE { #T_WHITESPACE print #T_PRINT #T_WHITESPACE '*'; #T_CONSTANT_ESCAPED_STRING #T_WHITESPACE } 

ma solo perché è stato letto non significa che sia stato eseguito.

Quindi le funzioni sono in cima alla list, in questo modo è ansible eseguirle perché già nella memory del sistema.

Credo che la ragione di ciò sia che la libreria nativa di PHP come PFO, le funzioni e le classi mysql_connect vengono caricate per prime e spostano tutti gli ambiti definiti dall'utente da caricare dopo le implementazioni native.

lì caricato all'inizio dell'esecuzione.

Questa è una grande domanda. Perché non ha una risposta davvero buona. PHP, se gliene sarà data la possibilità, lavorerà alla perfezione facendolo all'indietro. Finché non lo fa. E non lo farà se, ad esempio, la function viene definita in un file incluso che deve essere caricato in un secondo momento. PHP includerà quei file come accadono nel codice, quindi in questo caso otterrai un errore non definito dalla function.

Questo è un trucco SERIO in PHP.

Aiuta a immaginare che include come copiare / incollare ciò che era nell'altro file nel codice. Ma ciò accade solo quando vengono eseguiti nel codice. Ciò significa che possono essere dinamici e basati sul codice in esecuzione. Ma significa anche che non possono essere pre-elaborati e collegati in precedenza.

Trovo che sia una buona pratica definire prima le mie funzioni e poi chiamarle, ma non import where le metti finché sono lì;)

Inoltre, mi piace avere le mie funzioni separate in diversi file php, a seconda dell'uso, solo per essere organizzati 🙂

Non import where definisci la tua function e where chiami. Perché per quanto ne so, l'applicazione server PHP prima legge l'intera pagina e poi la esegue.