2012-01-15 11 views
14

Ho scaricato un framework e codice e ho una domanda riguardante require e include vs class_exists.Comprensione della classe richiesta ed esistente

Nel codice ho scaricato, vedo:

require_once('class.php'); 

Così come:

if(class_exists('class') == false) { require('class.php'); } 

ottengo require_once significa solo 1 volta e la classe esiste verificare se esiste la classe.

La mia domanda è: il secondo è migliore del primo? e perché?

+0

In realtà una prospettiva molto interessante, sono sorpreso che non abbia mai visto il secondo utilizzo prima. – esqew

+1

Vale la pena menzionare che esistono modi migliori al giorno d'oggi http://php.net/spl-autoload-register – KingCrunch

+2

Immagino che ogni file rappresenti una sola classe? Non hai più classi per file? –

risposta

9

questa condizione:

if(class_exists('class') == false) { require('class.php'); } 

impediscono il require_once di essere chiamato.

require_once può essere lento se si dispone di molti file inclusi nel progetto (specialmente framework) perché devono eseguire la scansione del codice per assicurarsi che il file non sia incluso due o più volte. quindi se hai più di 25 file che includi e sono nidificati, require_once dovrà controllarli tutti.

1

Il secondo fornisce una maggiore protezione dall'importazione della classe due volte. Il primo importa il file di classe una volta, ma se la classe è stata importata da un altro file per qualche motivo, il secondo capirà che la classe è già stata dichiarata in precedenza e non richiede il file di classe.

+0

nota: due classi con lo stesso nome sono quasi sempre una cattiva idea, quindi a meno che non si stia facendo qualcosa di pazzo, 'require_once' dovrebbe andare bene. –

1
  • require_once() solo include s un file una volta.

  • class_exists() verifica se esiste la classe .

È possibile definire una classe in più file e require_once() non interessa. Il tuo secondo pezzo lo farà.

5

Come discusso in altre risposte ci sono differenze semantiche tra le due varianti. Anche in uno scenario di hosting condiviso in cui il provider di hosting non offre il caching Opcode PHP (APC o equiv), tutti i file di codice devono essere letti e compilati una volta per richiesta. Qui il killer principale non è il tempo di compilazione stesso (~ 0.5 M istruzioni PHP/sec su un core moderno) ma il sovraccarico I/O della raccolta dei file PHP se non pre-memorizzato nella cache del file system (10s di I/Os/sec).

In questo scenario, se un'applicazione richiede un nucleo di una dozzina di moduli per il 90% delle query, allora ha senso memorizzare nella cache un pacchetto di questi in un unico file di bulkload. Se viene adottato questo tipo di soluzione, collocare una guardia class_exists('class') intorno al fabbisogno del file di classe lo rende a prova di bomba.

anche un avvertimento: se si utilizza una funzione di __autoload() fare classe Jit carico, essere consapevoli che class_exists('fred')sarà innescare il caricamento automatico di fred. Se si desidera una sonda debole, è necessario utilizzare il predicato !in_array('fred', get_declared_classes()).

Problemi correlati