Domanda

Ho una struttura di directory come la seguente;

script.php

inc/include1.php
inc/include2.php

oggetti/oggetto1.php
oggetti/oggetto2.php

sapone/soap.php

Ora utilizzo quegli oggetti in entrambi script.php E /soap/soap.php, potrei spostarli, ma voglio che la struttura della directory sia quella per un motivo specifico.Durante l'esecuzione script.php il percorso di inclusione è inc/include.php e durante l'esecuzione /soap/soap.php suo ../inc, i percorsi assoluti funzionano, /mnt/webdev/[project name]/inc/include1.php... Ma è una brutta soluzione se mai volessi spostare la directory in una posizione diversa.

Quindi esiste un modo per utilizzare percorsi relativi o un modo per generare a livello di codice il file "/mnt/webdev/[project name]/"?

È stato utile?

Soluzione

Questo dovrebbe funzionare

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

Modificare: ulteriore miglioramento da parte di aussieviking

Altri suggerimenti

Puoi usare percorsi relativi.Tentativo __FILE__.Questa è una costante PHP che restituisce sempre il percorso/nome file dello script in cui si trova.Quindi, dentro soap.php, potresti fare:

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

Il percorso completo e il nome file del file.Se utilizzato all'interno di un incluso, viene restituito il nome del file incluso.A partire da PHP 4.0.2, __FILE__ Contiene sempre un percorso assoluto con i collegamenti simbolici risolti mentre nelle versioni precedenti contenevano un percorso relativo in alcune circostanze. (fonte)

Un'altra soluzione sarebbe quella di impostare un file includere il percorso nel tuo file httpd.conf o .htaccess.

dai un'occhiata a http://au.php.net/reserved.variables

Penso che la variabile che stai cercando sia: $_SERVER["DOCUMENT_ROOT"]

Potresti definire una costante con il percorso della directory root del tuo progetto e quindi inserirla all'inizio del percorso.

Un altro modo per gestire ciò che elimina qualsiasi necessità di inclusione è utilizzare il file caricamento automatico caratteristica.Includere tutto ciò di cui lo script ha bisogno "per ogni evenienza" può ostacolare le prestazioni.Se le tue inclusioni sono tutte definizioni di classi o interfacce e desideri caricarle solo quando necessario, puoi sovraccaricare il file __autoload() funzione con il tuo codice per trovare il file di classe appropriato e caricarlo solo quando viene chiamato.Ecco l'esempio tratto dal manuale:

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

Finché imposti le variabili include_path di conseguenza, non avrai mai più bisogno di includere un file di classe.

Un'altra opzione, correlata a quella di Kevin, è l'uso __FILE__, ma sostituisci invece il nome del file php al suo interno:

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

Lo uso da un po'.L'unico problema è che a volte non ce l'hai $_SERVER['SCRIPT_NAME'], ma a volte esiste un'altra variabile simile.

Ho scoperto che funziona molto bene!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

Utilizzo:

<?php

function findRoot() {
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');

include(findRoot() . 'includes/head.php');

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
    $posts[$i]->displayArticle();
}

include(findRoot() . 'includes/footer.php');

?>

Penso che il modo migliore sia inserire i tuoi include nel percorso di inclusione PHP.Esistono vari modi per farlo a seconda della configurazione.

Quindi puoi semplicemente fare riferimento a

require_once 'inc1.php';

dall'interno di qualsiasi file indipendentemente da dove si trovi negli include o nei file accessibili dal Web o a qualsiasi livello di sottodirectory nidificate.

Ciò consente di avere i file di inclusione all'esterno della radice del server Web, che è una procedura consigliata.

per esempio.

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

Inoltre, controlla __autoload per il caricamento lento dei file di classe

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__caricamento automatico

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

Io uso questa riga di codice.Ritorna all'"inizio" dell'albero del sito, poi va al file desiderato.

Ad esempio, diciamo che ho questo albero di file:

dominio.com/aaa/index.php
dominio.com/bbb/ccc/ddd/index.php
dominio.com/_resources/functions.php

Posso includere il file Functions.php ovunque mi trovi, semplicemente copiando e incollando

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

Se è necessario utilizzare questo codice più volte, è possibile creare una funzione che restituisca il file str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)) parte.Quindi inserisci semplicemente questa funzione nel primo file che includi.Ho un file "initialize.php" che includo nella parte superiore di ogni pagina php e che contiene questa funzione.La prossima volta che devo includere file, in effetti utilizzo semplicemente la funzione (denominata path_back):

require(path_back()."/_resources/another_php_file.php");

@Flubba, questo mi consente di avere cartelle all'interno della mia directory di inclusione?le directory flat include mi fanno venire gli incubi.poiché l'intera directory degli oggetti dovrebbe trovarsi nella directory inc.

Oh sì, assolutamente.Quindi, ad esempio, utilizziamo un singolo livello di sottocartelle, generalmente:

require_once('library/string.class.php')

Devi stare attento a fare troppo affidamento sul percorso di inclusione in siti molto trafficati, perché php deve cercare nella directory corrente e poi in tutte le directory sul percorso di inclusione per vedere se il tuo file è lì e questo può rallentare le cose succedono se vieni martellato.

Quindi, ad esempio, se stai eseguendo MVC, inseriresti il ​​percorso della directory dell'applicazione nel percorso di inclusione e quindi specificherai il riferimento alle cose nel modulo

'model/user.class'
'controllers/front.php'

o qualunque cosa.

Ma in generale, ti consente semplicemente di lavorare con percorsi molto brevi nel tuo PHP che funzioneranno da qualsiasi luogo ed è molto più facile da leggere rispetto a tutto quel malarkey root del documento realpath.

Il vantaggio di queste alternative basate su script suggerite da altri è che funzionano ovunque, anche su box condivisi;l'impostazione del percorso di inclusione richiede un po' più di riflessione e impegno ma, come ho già detto, ti consente di iniziare a utilizzare __autoload che è semplicemente la cosa più interessante.

Se intendi includere un percorso specifico nella maggior parte dei file nella tua applicazione, crea una variabile globale nella cartella principale.

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

Ora questa variabile globale "PERCORSO_APPLICAZIONE" può essere utilizzato per includere tutti i file invece di chiamare realpath() ogni volta che includi un nuovo file.

EX:

include(APPLICATION_PATH ."/config/config.ini";

Spero che sia d'aiuto ;-)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top