it-swarm.it

PHP include percorsi relativi al file o al codice chiamante?

Ho difficoltà a comprendere il set di regole relativo a PHP relativi includono percorsi. Se eseguo il file A.PHP- e il file A.PHP include il file B.PHP che include il file C.PHP, nel caso in cui il il percorso relativo di C.PHP è in relazione alla posizione di B.PHP o alla posizione di A.PHP? Cioè, importa da quale file viene chiamato l'inclusione o solo da cosa la directory di lavoro corrente è- e cosa determina la directory di lavoro corrente?

100
Yarin

È relativo alla sceneggiatura principale, in questo caso A.php. Ricorda che include() inserisce semplicemente il codice nello script attualmente in esecuzione.

Cioè, importa da quale file viene chiamato include

No.

Se vuoi make è importante, e fai un'inclusione relativa a B.php, usa __FILE__ costante (o __DIR__ since PHP 5.2 IIRC) che indicherà sempre il file corrente letterale in cui si trova la riga di codice.

include(dirname(__FILE__)."/C.PHP");
120
Pekka 웃

@Pekka mi ha portato lì, ma voglio solo condividere ciò che ho imparato:

getcwd() restituisce la directory in cui risiede il file che hai iniziato a eseguire.

dirname(__FILE__) restituisce la directory del file contenente il codice attualmente in esecuzione.

Usando queste due funzioni, puoi sempre creare un percorso di inclusione relativo a ciò di cui hai bisogno.

ad esempio, se b.php e c.php condividono una directory, b.php può includere c.php come:

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

non importa da dove sia stato chiamato b.php.

In realtà, questo è il modo preferito di stabilire percorsi relativi, in quanto il codice aggiuntivo libera PHP dal dover iterare attraverso include_path nel tentativo di individuare il file di destinazione.

Fonti:

Differenza tra getcwd () e dirname (__ FILE__)? Quale dovrei usare?

Perché dovresti usare dirname ( [~ # ~] file [~ # ~] )

20
Yarin
  1. Se il percorso di inclusione non inizia con ./ O ../, Ad es .:

    include 'C.php'; // precedence: include_path (which include '.' at first),
                     // then path of current `.php` file (i.e. `B.php`), then `.`.
    
  2. Se il percorso di inclusione inizia con ./ O ../, Ad es .:

    include './C.php';  // relative to '.'
    
    include '../C.php'; // also relative to '.'
    

Il . O .. Sopra è relativo a getcwd(), che per impostazione predefinita è il percorso della voce .php File (cioè A.php) .

Testato su PHP 5.4.3 (Data di costruzione: 8 maggio 2012 00:47:34).

(Si noti inoltre che chdir() può modificare l'output di getcwd().)

16
Johnny Wong

La risposta accettata di Pekka è incompleta e, in un contesto generale, fuorviante. Se il file viene fornito come percorso relativo, il costrutto del linguaggio chiamato include lo cercherà nel modo seguente.

Innanzitutto, passerà attraverso i percorsi della variabile di ambiente include_path, Che può essere impostata con ini_set. Se fallisce, cercherà nella directory dello script chiamante dirname(__FILE__) (__DIR__ Con php> = 5.3.) Se anche questo fallisce, solo allora cercherà nella directory di lavoro! Si scopre che, per impostazione predefinita, la variabile di ambiente include_path Inizia con ., Che è la directory di lavoro corrente. Questo è l'unico motivo per cui cerca prima nella directory di lavoro corrente. Vedi http://php.net/manual/en/function.include.php .

I file sono inclusi in base al percorso del file indicato o, se non ne viene fornito nessuno, al percorso_inclusione specificato. Se il file non viene trovato in include_path, include infine controllerà la directory dello script chiamante e la directory di lavoro corrente prima di fallire.

Quindi, la risposta corretta alla prima parte della domanda è che importa dove si trova lo script chiamante incluso. La risposta all'ultima parte della domanda è che la directory di lavoro iniziale , in un contesto di web server, è la directory dello script chiamato, lo script che include tutti gli altri mentre è gestito da PHP. In un contesto da riga di comando, la directory di lavoro iniziale è quella che è quando php viene richiamato al prompt, non necessariamente la directory in cui si trova lo script chiamato. La directory di lavoro corrente , tuttavia, può essere modificata in fase di esecuzione con la funzione PHP chdir Vedi http://php.net/manual/en/function.chdir.php .

Questo paragrafo viene aggiunto per commentare altre risposte. Alcuni hanno affermato che basarsi su include_path È meno robusto e quindi è preferibile utilizzare percorsi completi come ./path O __DIR__ . /path. Alcuni sono arrivati ​​al punto di dire che basarsi sulla directory di lavoro . Non è sicuro, perché può essere modificato. Tuttavia, alcune volte, è necessario fare affidamento sui valori dell'ambiente. Ad esempio, potresti voler impostare include_path Vuoto, in modo che la directory dello script chiamante sia il primo posto in cui cercherà, anche prima della directory di lavoro corrente. Il codice potrebbe essere già stato scritto e aggiornato regolarmente da fonti esterne e non si desidera reinserire il prefisso __DIR__ Ogni volta che il codice viene aggiornato.

12
user2066805

Risposta breve: è relativa allo script incluso.

TFM lo spiega correttamente:

Se il file non viene trovato in include_path, include controllerà la directory dello script chiamante e la directory di lavoro corrente

Quindi, se /app/main.php dice include("./inc.php") che troverà /app/inc.php .

./ non è strettamente necessario ma rimuove qualsiasi dipendenza da include_path.

Non farei affidamento sulla ricerca dei file di inclusione nella directory di lavoro corrente nel caso in cui qualcuno lo cambi con chdir().

4
Denis Howe