2010-02-08 12 views
15

Un sacco di famosi script PHP tra cui WordPress utilizza dirname(__FILE__).'/myParent.php' invece di solo 'myParent.php' quando si includono file nella stessa directory dello script attualmente in esecuzione.Cosa c'è di meglio di require (dirname (__ FILE __). '/'. 'MyParent.php') che richiedere ('myParent.php')?

Non sono la stessa cosa? Perché preferisci scrivere di più?

Grazie.

+4

Si noti che si dovrebbe sempre preferire "__DIR__' in sostituzione di' dirname (__ FILE __) '. – Niko

+2

\ _ \ _ DIR \ __ è supportato a partire da PHP 5.3 – Lamy

risposta

16

PHP deve conoscere il percorso assoluto del file. dirname(__FILE__).'/myParent.php' è già il percorso assoluto ma 'myParent.php' richiede una ricerca utilizzando i percorsi specificati in include_path per ottenere un percorso assoluto e trovare il file. Una scelta migliore sarebbe './myParent.php':

Tuttavia, è più efficiente utilizzare in modo esplicito include './file' che avere PHP controllare sempre la directory corrente per ogni includono.

+1

Un percorso assoluto non è richiesto e il percorso di inclusione non è necessariamente necessario. "Se un percorso è definito (completo o relativo), il percorso include sarà completamente ignorato." http://us2.php.net/manual/en/function.include.php –

+2

@Justin Johnson: Con * path * il manuale probabilmente significa che la stringa contiene almeno un '/'. Quindi './Foo',' foo/bar', '/ foo/bar' sono percorsi ma' foo' non lo è. E questo vale anche per 'myParent.php'. – Gumbo

+0

Esiste un'alternativa per questo 'require dirname (dirname (dirname (__ FILE __))."/Out/DBconnection.php ";'? Voglio qualcosa come '. /' O '../../'. È lì? – stack

11

Utilizzando nomedir + nome del file è leggermente più veloce, perché PHP non scorrere include_path ricerca del file. Se la velocità conta, probabilmente digiterete di più.

14

Oltre all'aumento delle prestazioni (che è probabilmente una pre-ottimizzazione nella maggior parte dei casi *), protegge anche dallo scenario (molto strano) in cui la configurazione PHP dell'ambiente non ha la directory corrente (.) come parte del includere il percorso.

* Punto di riferimento di include utilizzando un percorso che richiede la ricerca include_path rispetto a un percorso relativo che non lo fa. Provato su 100000 iterazioni ogni

Risultati

include("include.php"): 8.3664200305939s 
include("./include.php"): 8.3511519432068s 

(8.3664200305939 - 8.3511519432068)/100000 = 0.000000152680874s 

meno che non siate tra cui centinaia o migliaia di file, 0.0000001s è trascurabile al meglio.

Codice di prova

define("MAX", 100000); 

ob_start(); 
$i = MAX; 
$_t = microtime(true); 
do { 
    include("include.php"); 
} while (--$i); 
$_t = microtime(true) - $_t; 
ob_end_clean(); 

echo "include(\"include.php\"): {$_t}s\n"; 

ob_start(); 
$i = MAX; 
$_t = microtime(true); 
do { 
    include("./include.php"); 
} while (--$i); 
$_t = microtime(true) - $_t; 
ob_end_clean(); 

Il test è stato condotto su un Macbook 2.16GHz 10.5.8 con PHP versione 5.2.9 (www.entropy.ch Release 7)

7

Un ulteriore nota su include (' ./file.php ').

Se solo la velocità conta, allora sì puoi usare include ('./ file.php'), ma se vuoi risolvere problemi di dipendenze e percorsi relativi, è meglio usare dirname (__ FILE __), perché

include('./file.php') 

sarà ancora costruire percorsi relativi allo script di esecuzione (la compresi edizione), mentre

include(dirname(__FILE__).'/file.php'); 

risolverà percorsi relativi allo script corrente cui risiede questa linea (il incluso lo script).

Generalmente, è meglio usare dirname (__ FILE __), poiché './' dà solo un aumento di prestazioni trascurabile mentre dirname (__ FILE __) ti offre un accesso molto più affidabile.

/EDIT: Si noti inoltre che il punto di riferimento fatto di cui sopra riguarda solo include('./something.php'), che in effetti è più veloce di include('something.php') perché non si ha il camminare include_path, ma quando si utilizza dirname(__FILE__) si ottiene la chiamata in testa dirname() funzione, che rende più lento di camminare su include_path (a meno che tu non abbia molti percorsi nel tuo include_path).

+3

o '__DIR__' (che salva una chiamata' dirname() ') – Steve

+3

Sì, ma' __DIR__' è disponibile solo da PHP 5.3.0 quando '__FILE__' e' dirname() 'sono entrambi disponibili da PHP 4.0.2. '__DIR__' è più efficiente, ma meno retrocompatibile: / – gaborous

Problemi correlati