2010-05-12 6 views
0

Je suis toujours à la recherche d'un moyen de l'exprimer correctement (je ne suis pas un locuteur natif ...).Appel d'une classe singleton à une fonction qui à son tour appelle la méthode de cette classe

Je cette classe SQL qui met en œuvre le modèle singleton (pour des raisons évidentes) et j'ai aussi cette fonction, checkUsr(), qui interroge la base de données en utilisant l'une des méthodes de SQL. Tout fonctionne bien tant que je n'appelle pas checkUsr() de la classe SQL. Quand je le fais, les scripts se terminent et une page blanche est affichée - aucune erreur n'est renvoyée, aucune exception n'est levée ... Que se passe-t-il? Et comment puis-je contourner ce problème?

EDIT:

un code ici:

class SQL 
{ 
    public static function singleton() 
    { 
    static $instance; 
    if(!isset($instance)) 
     $instance = new SQL; 
    return $instance; 
    } 

    public function someOtherFun() 
    { 
    checkUsr(); 
    } 

    public function tryLoginAuthor($login, $sha1) 
    { 
    // SQL query 
    } 
} 

function checkUsr() 
{ 
    if (!isset($_SESSION['login']) || !isset($_SESSION['sha1'])) 
     throw new Exception('Not logged in', 1); 
    $SQL = SQL::singleton(); 
    $res = $SQL->tryLoginAuthor($_SESSION['login'], $_SESSION['sha1']); 
    if (!isset($res[0])) 
     throw new Exception('Not logged in', 1); 
} 

Le problème se produit, quand je l'appelle checkUsr à partir de la classe SQL. Il ne se produit pas, cependant, lorsqu'il est appelé à partir d'une autre classe ...

+0

Un code serait génial. Appelez-vous checkUsr() en utilisant $ this-> checkUsr()? – tplaner

Répondre

0

Vous devez activer error_reporting, pour voir les messages d'erreur par php, sinon vous obtiendrez la page blanche que vous décrivez. En haut de votre fichier index.php, ceux-ci comprennent:

ini_set('display_errors', true); 
error_reporting(E_ALL | E_STRICT); 

Ne pas oublier de l'éteindre dans votre machine de production, c'est seulement pour le développement.

Vous avez déclaré la variable $ instance, statique dans la fonction, et non dans la classe. Ce sont deux choses complètement différentes. Voir l'utilisation des variables statiques here et voir l'utilisation d'une propriété de classe statique here. Vous avez besoin de ce dernier, donc changer votre code à ceci:

class SQL { 
    static $instance; 
    public static function singleton() 
     { 
     if(!isset(self::$instance)) 
      self::$instance = new SQL; 
     return self::$instance; 
     } 
... 

} 

La mise en œuvre d'une classe SQL, ou tout autre type d'accès de base de données comme singleton est une très mauvaise idée, il va vous mordre très dur à la longue . S'il s'avère que vous avez besoin de prendre en charge une autre base de données, comme si vous deviez extraire des informations d'un forum, dans une base de données différente de celle de votre site, vous aurez de sérieux problèmes.

+0

J'utilise les rapports d'erreur personnalisés et la gestion des exceptions, qui (dans l'environnement du développeur) génère simplement ce qui peut arriver. Cependant, vous avez le point sur la portée variable - bien que cela ne semble pas être le problème. J'ai résolu le problème par une solution de contournement pour le moment et j'y reviendrai plus tard. Cependant, merci pour votre aide - bien que je ne sois pas d'accord sur l'utilisation des classes SQL singleton, mais ce serait un débat beaucoup plus long;) –

+0

Il y avait une erreur dans la fonction singleton, il est maintenant corrigé. –