2010-11-24 7 views
1

J'ai un TopLevelClass qui appelle AnotherClass qui a des fonctions. Depuis l'intérieur des fonctions, comment accéder à some_other_methods() pour TopLevelClass?Accès aux méthodes parent en PHP

Si elle était JavaScript esque mon problème ressemblerait à ceci:

$this->parent()->parent()->do_something() 

et il serait équivalent à

$this_function->AnotherClass()->LevelClass()->some_other_methods() 
+0

Merci pour l'édition insaisissable – buley

+0

Pouvez-vous donner un exemple montrant pourquoi vous voulez faire cela? – rojoca

+0

Bien sûr. Je voudrais utiliser une classe comme, fondamentalement, un bus pour les messages parmi les autres classes. Donc, une sous-classe est, disons, Queue(), et dedans vous pouvez appeler des méthodes comme Queue() -> get_item(). Il y en a un autre qui est Work() -> do_work(). J'aimerais pouvoir déclarer et instancier les classes une fois dans la classe Bus() et que les modules s'appellent les uns les autres. Par exemple, depuis Work() -> do_work() vous pouvez appeler $ Bus-> queue-> get_item(), $ Bus-> queue-> delete_item() ou $ Bus-> notify-> item_processed(). – buley

Répondre

3

Si vous utilisez un héritage approprié, vous n'avez besoin que du mot-clé parent.

class foo { 
    protected function fooMethod() {} 
} 
class bar extends foo { 
    public function barMethod() { 
     parent::fooMethod(); 
     // technically, you could do the same thing with $this->fooMethod() 
     // but this way you also know how to do it with methods that might have 
     // the same name as one another, such as parent::__construct() 
    } 
} 
+0

Pouvez-vous faire deux niveaux de parentage? Par exemple, parent :: fooMethod() :: parent :: anotherMethod ou parent :: parent :: anotherMethod()? – buley

+1

non, pour plusieurs niveaux d'héritage, vous devrez avoir accès à des méthodes dans la classe de niveau intermédiaire et l'appeler. Si vous répétiez ce modèle avec une classe nommée 'baz', alors' bazMethod() 'devrait appeler' parent :: barMethod() ' – Dereleased

+1

@editor: Si vous avez besoin d'accéder directement à la méthode parent d'un objet, il y a probablement quelque chose de mal avec votre conception. – netcoder

1

le haut de ma tête:

parent::some_other_methods(); 
+0

Est-ce que cela accède à la méthode via la chaîne de portée actuelle ou démarre une nouvelle instance de la classe? – buley

+1

Il ne créera pas une nouvelle instance, car une nouvelle instance n'est pas son parent. – Harmen

1

Vous pouvez faire AnotherClass étendre TopLevelClass avec:

class AnotherClass extends TopLevelClass { 
    // class stuff in here 
} 

Cela donnerait accès AnotherClass à toutes les méthodes de TopLevelClass ainsi que ses propres (sous réserve de l'état de champ privé).

+0

Que se passe-t-il s'il y a deux noms de méthodes en conflit?Par exemple, disons que les deux ont des méthodes statiques appelées "do_hooks" - auriez-vous à renommer pour les rendre uniques? – buley

+1

La méthode étendue peut toujours appeler son parent avec parent :: do_hooks(). Voir http://www.php.net/manual/fr/keyword.parent.php pour quelques exemples. – foxsoup

Questions connexes