Come usare include all’interno di una funzione?

Ho una grande funzione che desidero caricare solo quando è necessario. Quindi presumo che usare include sia la strada da percorrere. Ma ho bisogno anche di diverse funzioni di supporto, solo in go_do_it ().

Se si trovano nel file incluso, viene visualizzato un errore di ridenominazione. Vedi l’esempio A

Se metto le funzioni di supporto in un include_once, funziona bene, vedi Esempio B.

Se utilizzo include_once per il codice func_1, la seconda chiamata ha esito negativo.

Sono confuso sul motivo per cui include_once fa fallire la funzione nella seconda chiamata, sembra non “vedere” il codice la seconda volta, ma se sono presenti funzioni annidate, le “vede”.

Esempio A:

 <?php /* func_1.php */ echo '
Doing it'; nested_func() function nested_func(){ echo ' in nest'; } ?>

Esempio B:

  <?php /* func_1.php */ echo '
- doing it'; nested_func(); ?>

Il problema con l’uso di include() all’interno di una funzione è che:

 include 'file1.php'; function include2() { include 'file2.php'; } 

file1.php avrà portata globale. file2.php ambito di file2.php è locale alla funzione include2 .

Ora tutte le funzioni hanno portata globale ma le variabili no. Non sono sorpreso di questo casino con include_once . Se vuoi davvero andare in questo modo – e onestamente non lo farei – potresti aver bisogno di prendere in prestito un vecchio trucco per il preprocessore in C / C ++:

 if (!defined(FILE1_PHP)) { define(FILE1_PHP, true); // code here } 

Se si desidera eseguire il caricamento lazy (che, a proposito, può avere problemi di cache dell’opcode) utilizzare invece l’autoloading.

Ho una grande funzione che desidero caricare solo quando è necessario. Quindi presumo che usare include sia la strada da percorrere.

La tua ipotesi di base è sbagliata. Questo tipo di ottimizzazione è controproducente; anche se la tua funzione è lunga centinaia di righe, non ci sarà alcun beneficio evidente per nasconderlo dal parser di PHP. Il costo per PHP di analizzare un file è trascurabile; guadagni di velocità reali notevoli provengono dalla ricerca di algoritmi migliori o da modi migliori per parlare al database.

Detto questo, dovresti includere la definizione della funzione nel file incluso. Piuttosto che spostare il corpo della funzione in func_1.php , sposta l’ intera funzione nel file. È quindi ansible require_once il file contenente la funzione all’interno di ciascun file in cui è necessario, e assicurarsi che sia incluso esattamente una volta indipendentemente da quante volte si tenta di includerlo.

Un esempio:

file1.php

 function test() { } 

index.php

 require_once('file1.php'); include('table_of_contents.php'); test();