require_once - require php




PHP include percorsi relativi al file o al codice chiamante? (4)

Ho difficoltà a capire il set di regole relativo ai percorsi di inclusione relativi di PHP. Se eseguo il file A.PHP- e il file A.PHP include il file B.PHP che include il file C.PHP, se il percorso relativo a C.PHP è in relazione alla posizione di B.PHP o alla posizione di A .PHP? Vale a dire, importa quale file viene chiamato da include, o solo quale sia la directory di lavoro corrente- e cosa determina la directory di lavoro corrente?


  1. Se include path non inizia con ./ o ../ , ad esempio:

    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 include inizia con ./ o ../ , ad esempio:

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

Il . o .. sopra è relativo a getcwd() , che ha come valore predefinito il percorso del file .php voce (cioè A.php ).

Testato su PHP 5.4.3 (Build Date: 8 maggio 2012 00:47:34).

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


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

getcwd() restituisce la directory in cui si trova il file che hai iniziato ad 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ò che ti serve.

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 è stato chiamato b.php.

In effetti, questo è il modo preferito per stabilire percorsi relativi, poiché il codice extra libera PHP dall'avere iterato attraverso l'include_path nel tentativo di localizzare il file di destinazione.

fonti:

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

Perché dovresti usare dirname ( FILE )


Risposta breve: è relativa allo script incluso.

http://php.net/manual/en/function.include.php spiega correttamente:

Se il file non è stato 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 .

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

Non mi affiderei alla ricerca di file inclusi nella directory di lavoro corrente nel caso qualcuno lo cambi con chdir() .


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

Cioè, importa quale file viene chiamato l'inclusione

No.

Se vuoi renderlo rilevante e fare un include relativo a B.php, usa la costante __FILE__ (o __DIR__ dal PHP 5.2 IIRC) che punta sempre al file corrente letterale in cui si trova la riga di codice.

include(dirname(__FILE__)."/C.PHP");




relative-path