Je suis un peu nouveau dans la programmation OOP, donc il est très probable que je fasse une erreur stupide. Voici mon problème. Lors de l'exécution de mon code, je reçois l'erreur suivante:Problème avec les variables globales
Fatal error: Call to a member function checkLogin() on a non-object in /application/libraries/Session.php on line 30
est Ci-dessous le fichier session.php (je l'ai commenté la ligne 30 pour le rendre plus facile à trouver):
<?php
require_once(LIBPATH . 'MySQLDB.php');
require_once(LIBPATH . 'Authentication.php');
class Session {
public $url;
public $referrer;
public $redirect;
function Session() {
$this->startSession();
}
function startSession() {
global $auth;
session_start();
if (isset($_SESSION['url'])) {
$this->referrer = $_SESSION['url'];
} else {
$this->referrer = '/';
}
$this->url = $_SESSION['url'] = $_SERVER['PHP_SELF'];
if (isset($_SESSION['redirect'])) {
$this->redirect = $_SESSION['redirect'];
} else {
$this->redirect = $_SESSION['redirect'] = '/';
}
$auth->checkLogin(); // LINE 30
}
function setRedirect($page) {
$this->redirect = $_SESSION['redirect'] = $page;
}
}
Dans mes tentatives de dépanner le problème que j'ai mis echo gettype ($ auth) entre la déclaration includes et class. La sortie résultante était "Objet". J'ai ensuite essayé de mettre echo gettype ($ auth) juste après que je déclare global $ auth dans la fonction startSession. La sortie résultante était "NULL". Une idée de ce que mon problème peut être? Merci.
EDIT: $ auth est déclaré dans authentication.php
+1 Les globals sont mauvais, ils seront éliminés dans 6 et c'est une mauvaise habitude de les utiliser quand même. –
Question rapide. Il me semble qu'il serait mauvais de continuer à instancier de nouvelles instances de certaines classes comme une classe de base de données ou une classe de session. J'ai fait un peu de lecture et il semble que la solution soit d'utiliser un motif Singleton. Seriez-vous d'accord avec l'utilisation d'un modèle Singleton ou est-ce une meilleure méthode? Merci de votre aide. – blcArmadillo
Les singletons sont parfaits pour ces types de situations, où * vraiment * ne doit être qu'une seule instance globale d'une classe car cette classe fournit un seul service au reste de l'application. Le motif singleton est également l'un des motifs les plus abusés, alors assurez-vous de ne pas en abuser. –