2009-03-13 11 views
1

En résumé: comment accéder aux méthodes d'une classe instanciée par une méthode d'une classe différente?Accéder à une classe qui a été instanciée par une méthode dans une classe distincte

Il y a un peu de code, je suis à la recherche en ce moment qui effectue les opérations suivantes (modifier le code est une option, btw Il est pas à moi ... Je déchiffre juste.):

Une classe a une méthode qui instancie une classe différente. Il ressemble à ceci:

 
// this file is named fooClassHere.php 

class Foo{ 
    public $meh; 

    function bar(){ 
     $something = new Baz; 
     $this->meh = $something->getStuff(); 
    } 
} 

Ce que je suis en train de comprendre est comment accéder aux méthodes de cette classe instanciée Baz. Une autre page contient quelque chose comme ce qui suit:

 
include 'bazClassHere.php'; 
include 'fooClassHere.php'; 

$a = new Foo; 
$a->bar(); 

ne devrait donc pas tous Baz disponible maintenant d'une certaine manière (et non pas seulement getStuff() que j'affecté à $ this-> meh)? Les classes Foo et Baz sont incluses, le code instancie Foo, puis appelle la méthode bar de Foo() qui à son tour instancie la classe Baz. Il est évident que ce qui suit affiche les données retournées par la méthode getStuff de Baz():

 
var_dump($a->meh); 

Mais je voudrais accéder tous des méthodes disponibles de Baz sans passer par l'étape intermédiaire de leur assigner manuellement comme je l'ai fait à l'intérieur Foo méthode de bar:

$this->meh = $something->getStuff()

Peut-être quelque chose comme (mais bien sûr, cela ne fonctionne pas):

 
$a = new Foo;
$a->bar(); //instantiates Baz as $something $a->something->fromBaz(); //$something is an instance of Baz, yes? No?

J'espère que cela est logique et je ne confondez pas la question avec mes notes. Ack! > _ <

Répondre

3

Si la modification du code n'est pas une option, vous n'avez pas de chance. Pour obtenir ce que vous voulez vous faire ceci:

class Foo { 
    public $meh; 
    public $something; 

    function bar(){ 
     $this->something = new Baz; 
     $this->meh = $this->something->getStuff(); 
    } 
} 

Et puis plus tard vous pouvez faire:

$foo = new Foo; 
$foo->something->myBazMethod(); 
+0

Donc, $ a-> something-> fromBaz() va fonctionner? Soit, son quelque chose et votre baz sont des instances de Baz? –

+0

non, les OP ne fonctionneraient pas car $ quelque chose est juste une variable locale à la méthode bar(). il a besoin de faire quelque chose d'une variable de classe et de le définir par $ this afin qu'il puisse alors accéder au nouvel objet Baz en dehors de la classe à travers un objet Foo. –

+0

Fantastique! J'ai dupliqué le code que je regarde (puisque je ne peux pas changer l'original mais je veux vraiment voir ce travail), j'ai fait de la variable qui instancie Baz en une variable de classe et cela fonctionne comme annoncé. Cela m'aide à faire en sorte que toute la POO soit plus droite dans ma tête. Merci (allez FSU). – Stuart

1

Vous pouvez utiliser __call sur votre classe Foo, regarder sur php.net

Fondamentalement, __call est appelé lorsque vous essayez d'appeler une fonction que la classe n'a pas. Là, vous pouvez passer la requête à votre objet intérieur à la place.

class a 
{ 
    protected $b; 

    public function __construct() 
    { 
     $this->b = new b(); 
    } 

    public function meh() 
    { 
     return 'meh'; 
    } 

    public function __call($func, $param) 
    { 
     return call_user_func_array(array($this->b, $func), $param); 
    } 
} 

class b 
{ 
    public function yo($something) 
    { 
     return $something; 
    } 
} 

$a = new a(); 
echo $a->meh(); 
echo $a->yo('dude!'); 
+0

Hey Mario, avez-vous un exemple de la façon dont vous feriez cela? J'ai utilisé __call pour gérer une méthode inexistante appelée mais pas pour accéder à une méthode qui existe mais fait partie d'un objet différent. – Stuart

+0

Bien sûr, regardez ma réponse mise à jour. – Mario

Questions connexes