2010-03-09 5 views
0

J'ai cette classe qui a une fonction pour charger d'autres classes et créer des instances.session_start() provoque un objet à devenir non-objet

si vous avez utilisé cette classe comme ceci:

$test = new test(); 
    $test->load("email"); 

il fonctionne parfaitement comme prévu mais lors de l'utilisation session_start();

$test = new test(); 
session_start(); 
$test->load("email"); 

une erreur est créée et rien d'autre est là: PHP Erreur fatale: Appel à une charge de fonction membre() sur un non-objet Bla bla bla

la classe utilisée avec session_start:

<?php 

class test 
{ 


function load($class){ 

    static $objects = array(); 

    if (isset($objects[$class])) 
    { 
    return $objects[$class]; 
    } 

    require('libraries/'.$class.'.php'); 

    $name = 'ext_'.$class; 

    $objects[$class] =& new $name(); 

    $this->$class = $objects[$class]; 

    return $objects[$class]; 


} 

} 


$test = new test(); 

session_start(); 

$test->load("email"); 
?> 

et voici les bibliothèques/email.php:

<?php 


class ext_email 
{ 

function ext_email(){ 
     echo "email is working"; 
} 

} 

?> 

ca n vous s'il vous plaît conseiller ce qui ne va pas avec cela? un moyen d'améliorer la fonction de chargement? cette chose fonctionne sur certaines installations de Apache et ne fonctionne pas sur les autres. en fonction de certaines configs que je ne sais pas ce que c'est exactement ..

Je veux être en mesure de faire ce qui suit: $ test = new test();

session_start(); 

$test->load("email"); 

Merci beaucoup à l'avance

+0

Intéressant, en tant que walkaround, ne pourriez-vous pas coller simplement l'appel 'session_start' au sommet absolu de votre code? –

+0

Fonctionne bien sur ma fin. Peut-être devriez-vous essayer 'var_dump' sur' $ test' avant et après l'appel de 'session_start()' pour voir ce qui change. –

+0

non je ne peux pas déplacer session_start(), c'est toujours pareil même si j'ai déplacé session_start vers le haut –

Répondre

3

Peut-être que vous avez une variable nommée test dans $_SESSION, et ont permis register_globals?

Dans ce cas, la variable $_SESSION['test'] sera créée comme une variable globale $test par l'appel à session_start(), overridding une variable $test existante de votre script.

Cela permettrait également d'expliquer pourquoi cela se passe sur certains serveurs et pas d'autres: register_globals est Off par défaut - et a été pendant de nombreuses années, mais certains hôtes le garder activé :-(

(Lorsque les gens disent register_globals est mal, ce n'est pas sans raison ...)


Pour plus d'informations, vous pouvez lire la page Using Register Globals du manuel - il y a même un paragraphe sur $_SESSION et certains problèmes que register_globals peut causer.


Maintenant, comment résoudre ce problème ...Eh bien, je suppose que le meilleur moyen serait de faire en sorte que session_start() est appelé avant de vous mettre $test à ce que vous voulez qu'il soit:

session_start(); 
$test = new test(); 
$test->load("email"); 

De cette façon, même si un $test est créé à cause de register_globals, votre variable remplacera - et le dernier est celui qui est à droite ^^

Mais la meilleure solution serait de transformer register_globals Off: c'est un reliquate du passé ... cela ne devrait probablement jamais existé :-(
(Il y a de mauvaises choses en PHP, c'est l'un d'entre eux, en mon opinion)

+0

Cool! merci beaucoup qui a résolu mon problème j'ai changé de test dans $ _SESSION et ça marche maintenant !! –

+0

Je suppose que c'est une solution aussi - mais n'oubliez pas que vous pourriez encore rencontrer le même genre de problème, pour d'autres variables! ;;; Vous êtes les bienvenus :-) –

+0

oui vous avez raison, mais il n'est pas possible de demander à tout le monde de désactiver register_globals pour que cela fonctionne !!! merci encore –

Questions connexes