È un problema di percorso.
È buona norma stilare il proprio codice con un ritorno a capo alla fine del file o in certi contesti per la parentesi graffa di chiusura.
Focalizza mentalmente il tuo progetto, sicuramente con 5 percorsi potrai presto.
il singolo punto equivale a dire cartella corrente mentre il doppio punto equivale a dire cartella padre, ho scritto un breve codice di illustrazione spero ti sia di aiuto.
Ovviamente settings.php, load.php , /cartella/a.php dovrebbe essere caricato una sola volta ma per i programmatori esterni è difficile tale vincolo.
/cartella/a.php
<?php
$path = rtrim(dirname(dirname(__FILE__)), '\\/');
$path2 = $path;
$file = str_replace('/', DIRECTORY_SEPARATOR, '/load.php');
$file2 = $file;
require_once $path.$file;
$path = $path2;
$file = $file2;
$root = root_absolute($path);
unset($path, $file, $path2, $file2);
$_SERVER['DOCUMENT_ROOT'] = $root;
$_ENV['DOCUMENT_ROOT'] = $root;
$a = remove_dir(__FILE__).DIRECTORY_SEPARATOR;
$i = 1;
$a = rtrim(recursive_full_path($a, $i), '\\/').DIRECTORY_SEPARATOR; // ho dirname $a per la seconda volta
$display = rtrim(APPPATH, '\\/') ? rtrim(APPATH, '\\/') : DIRECTORY_SEPARATOR;
echo 'la tua web root è '.$root."\n";
echo 'la tua app root è '.$display."\n";
echo '1 esempio con remove_dir(__FILE__) e recursive_full_path(__FILE__) '.$a."\n";
// fine primo esempio
//scorro due volte
$i = 2;
$a = rtrim(recursive_full_path(__FILE__, $i), '\\/').DIRECTORY_SEPARATOR;
echo '2 esempio scorro due volte con recursive_full_path(__FILE__) '.$a."\n";
unset($a, $i, $display); //cancello le variabili globali
//fine secondo esempio
/settings.php
<?php
function root_absolute($path) {
$path2 = str_replace(DIRECTORY_SEPARATOR, '/', "$path");
$root = $_SERVER['REQUEST_URI'] ? $path2 : '/';
$a = dirname($_SERVER['REQUEST_URI']);
if($a != $path2 && strpos(strrev($path2), strrev($a) === 0)) {
$root = substr($path2, 0, strlen($path2)-strlen($a));
}
$root = str_replace('/', DIRECTORY_SEPARATOR, "$root");
return $root;
}
function recursive_full_path($a, $i=1) {
$a = dirname($a).DIRECTORY_SEPARATOR;
if(((--$i) > 0)) {
return recursive_full_path($a, $i);
}
return $a;
}
function remove_dir($a) {
$a = rtrim(full_path($a), '\\/');
return $a;
}
// questa funzione è per uso interno invece leggi remove_dir($a) o meglio recursive_full_path($a, $i)
function full_path($a) {
$a = dirname($a);
return $a;
}
/load.php
<?php
$path = rtrim(dirname(__FILE__), '\\/');
$file = str_replace('/', DIRECTORY_SEPARATOR, '/settings.php');
require_once $path.$file;
if( ! defined( 'APPPATH' ) ) {
define( 'APPPATH', "$path" . DIRECTORY_SEPARATOR );
}
unset($path, $file);
dirname può restituire / se è solamente questo carattere, dicasi root (in realtà la root può essere altrove ma il doc afferma questo).
Il terzo e il quarto esempio dopo aver incluso load.php che inserisce anche settings.php , load.php crea la costante root app APPPATH e successivamente la variabile per la web root mentre il quinto è include dirname(__FILE__).'/percorso_file.php';.
Se crei il codice conosci già a priori se il progetto di tale file risiede in una cartella o sono al livello prima o dopo.. quindi tutti e 5 gli esempi sono complementari.