2009-05-28 10 views
1

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

Répondre

2

Sans voir comment $auth est défini dans Authentication.php, il est difficile d'aider.

Aussi, puisque vous êtes nouveau à OOP permettez-moi d'être le premier à vous dire que globals sont mauvais. Ne les utilisez pas. Si vous vous sentez obligé de le faire, c'est probablement parce que vous avez un mauvais design. Vous devriez repenser cela au lieu d'utiliser des globals pour résoudre rapidement votre problème. Au lieu de cela, instancier une nouvelle instance de votre classe Authentication en faisant quelque chose comme

$auth = new Authentication; 

Assurez-vous que Authentication est effectivement configuré correctement en tant que classe et tout. Docs en ligne de PHP a un bon OOP introduction, vous pouvez jeter un oeil, aussi.

+0

+1 Les globals sont mauvais, ils seront éliminés dans 6 et c'est une mauvaise habitude de les utiliser quand même. –

+0

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

+0

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. –

-1

Assurez-vous que auth $ est déclarée globale dans authentication.php

+1

Vous ne déclarez pas les variables comme globales dans PHP. Global est uniquement utilisé pour importer une variable dans la portée de la fonction. –

1

Le problème est pas dans le code que vous montrer réellement. Je suis assez confiant que le vrai problème se situe quelque part après la déclaration de la session, mais avant que vous en créez réellement une instance. Essayez d'insérer var_dump ($ auth); juste avant que vous appelez new Session et voir si c'est réellement là. Ensuite, vous pouvez tester le code en arrière et localiser le point où il n'est pas défini.

De plus, comme cela a déjà été mentionné: Les globaux doivent être évités. Une meilleure solution serait de passer $auth en tant que paramètre au constructeur de Session et de le stocker en tant que variable membre de la classe.

0

Le message d'erreur:

Fatal error: Call to a member function checkLogin() on a non-object in /application/libraries/Session.php on line 30 

signifie que PHP ne peut pas trouver la fonction checkLogin dans le Authenrication.php. Assurez-vous d'instancier la classe trouvée dans Authentication.php à votre Session.php ou passez la variable instanciée à votre classe Session.

Questions connexes