(19-01-2011, 01:17 AM)Argorate a écrit : Ca n'a rien avoir avec la session utilisateur: savoir si la page où l'on est nécessite "../../" (par exemple) pour les fichiers a inclure, n'a - à mon sens - rien a faire dans une session, ce n'est pas propre à la session de l'utilisateur... tu vois se que je veux dire?
Pour ce genre d'info, j'utilise plutot ce genre de code :
// Dans le fichier à la racine, on définit une constante avec le chemin absolu :
define('APP_BASE_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
// ensuite pour les includes :
include APP_BASE_PATH . 'include/lib/mon_fichier.inc.php';
L'avantage d'une constante par rapport à une variable globale, c'est que tu n'as pas de risque qu'elle soit écrasée plus tard...
Comme ça, jamais de soucis de "profondeur"
Sinon pour éviter les variables globales qui d'une part augmente considérablement le risque de bug mais sont aussi souvent à l'origine de faille de sécurité, un petite astuce est d'utiliser une classe de registre :
class Registre
{
// Espace de stockage de nos variables
private $_vars;
// Il s'agit d'un singleton, constructeur privé
private function __construct()
{
$this->_vars = array();
}
// Il s'agit toujours d'un singleton donc on évite le clonnage
public function __clone()
{
throw new Exception("Clonage d'un singleton interdit");
}
// Et donc pour récupéré l'objet :
static public function getInstance()
{
static $instance = null;
if (is_null($instance))
$instance = new self();
return $instance;
}
// le getter
public function __get($var)
{
return $this->_vars[$var];
}
// le setter
public function __set($var, $val)
{
$this->_vars[$var] = $val;
return $val;
}
// Tester si la variable existe
public function __isset($var)
{
return isset($this->_vars[$var]);
}
}
Et ensuite pour l'utiliser N'IMPORTE OU dans votre code, dans une fonction ou non :
// Affectation :
$registre = Registre::getInstance();
$registre->ma_var = 'test';
// ou alors :
Registre::getInstance->ma_var = 'test'; // identique
// plus loin, dans une fonction, pour lire la variable :
echo Registre::getInstance()->ma_var;
// ou alors :
$registre = Registre::getInstance();
echo $registre->ma_var;
// Et enfin vous pouvez même tester si la variable existe déjà :
$registre = Registre::getInstance();
if (isset($registre->ma_var))
{
echo $registre->ma_var;
}
Voilà, plus besoin de variables globales, c'est plus propre et plus sécurisé...