2010-11-19 4 views
0

J'ai des problèmes pour créer un "super objet" (similaire à celui de CodeIgniter) pour un projet de framework sur lequel je travaille. Je veux créer un super objet que toutes mes autres classes vont parcourir. Je l'ai fait, mais il semble que je suis incapable d'utiliser l'objet de mon objet super dans chacune de mes classes sans utiliser le mot clé global dans chaque fonction.Problème de portée variable avec super objet

J'ai quelque chose comme ceci:

class a 
{ 
    function aa() 
    { 
     return 'class a'; 
    } 
} 

class b 
{ 
    function bb() 
    { 
     $blah->a->aa(); 
    } 
} 

class superobj 
{ 
    function loadClass($class) 
    { 
     $this->$class = new $class; 
    } 
} 

class blah extends superobj 
{ 
    function __construct() 
    { 
     $this->loadClass('a'); 
     $this->loadClass('b'); 
    } 
} 

$blah = new $blah; 

Donc, si je cours, j'obtiens une erreur parce que je ne peux pas accéder à la méthode aa. Si je mets global $ bla dans la méthode bb, alors ça marche (ou du moins dans mon vrai projet ça marche, je ne sais pas à propos de cette maquette de 5 secondes hehe).

Alors est-il possible de rendre l'objet $ blah global de sorte que je n'ai pas besoin de le référencer pour chaque méthode, OU existe-t-il un meilleur moyen de réaliser ce que j'essaie de faire?

Je ne suis pas très bon à POO ...

+0

duplication possible: http://stackoverflow.com/questions/1234445/php-global-variables – thomaspaulb

Répondre

3
function bb() { 
    $blah->a->aa(); 
} 

En effet, comme toute fonction, cette fonction n'a pas de variables dans son champ d'application. $blah n'a été ni passé à la fonction ni défini dans la fonction, il n'existe donc pas.

Si vos objets dépendent d'une instance de blah pour fonctionner, vous devez la transmettre au constructeur.

class b { 

    var $blah = null; 

    function __construct($blah) { 
     $this->blah = $blah; 
    } 

    function bb() { 
     $this->blah->foo(); 
    } 
} 

$b = new b($instanceOfBlah); 

Vous pouvez également utiliser une classe statique qui contient des références à des objets globaux et les renvoie sur demande (modèle de registre, comme $blah = Registry::get('blah')).

N'utilisez pas global. Ne fais pas ça.

+0

Y a-t-il un moyen de le faire pour le constructeur de blah, afin que chaque classe qui étend bla puisse automatiquement utiliser son méthodes? – Scott

+0

@Scott Si une classe * extends * blah, bien sûr, elle pourra utiliser les méthodes de blah comme la sienne. – deceze

+0

Je vais essayer d'expliquer cela, nu avec moi. Si je charge "classe b" par "superobj", comme je le fais dans mon exemple ci-dessus, je ne peux pas utiliser les méthodes de "classe a". Si je charge "classe b" en dehors de superobj, alors ça marche. Cependant, j'en ai besoin pour pouvoir charger à travers superobj, donc je n'ai jamais besoin d'utiliser un seul objet pour toutes mes bibliothèques. EDIT: Notez que dans mon exemple ci-dessus je ne prolonge pas blah, cependant dans mon vrai projet je suis, et appeler $ this-> a-> aa, par exemple, ne fonctionne pas. – Scott