J'essaye avec PHP OOP
Qu'est-ce que j'essaie de trouver est, est-il possible d'accéder à une instance d'objet à partir d'un objet créé dans cette instance d'objet? P>
Sons Confusion, alors voici un exemple: p>
contenu de l'index p> contenu de innerclass.php p> Le but de ce cas d'essai est de rendre la classe interne décider si / quand exécuter la fonction ECHODATA principale P> Comment l'exemple ci-dessus peut-il être accompli? (Sans s'appuyer sur des classes statiques ou des singletons ou des classes étendues) p>
8 Réponses :
non. Lorsque vous créez un objet en tant que membre d'un autre objet: Il est à ma connaissance, aucun moyen d'accéder à l'élément parent. Vous devriez transmettre une référence à l'élément parent à l'objet lorsque vous le créez: p> une définition de classe, cependant, ne devrait jamais réexécuter dans une fonction, même si Cela peut être possible.
Les définitions de classe peuvent avoir une hiérarchie - elles peuvent s'étendre. Mais cela est invoqué en utilisant Je ne sais pas ce que vous essayez de faire, mais peut-être que ce que vous recherchez est em> prolonger une classe. Dans ce cas, vous pouvez accéder aux fonctions et aux variables définies dans le parent à l'aide du mot clé code> parent p> C'est quelque chose fondamentalement différent de celui de Ce que tu fais en ce moment. P> p> étend code>. Une classe peut
étendre code> un autre. Leur définition est toujours côte à côte, elles ne sont pas imbriquées dans le code. P>
La seule façon pour la classe interne d'avoir accès à la classe extérieure est que l'instance extérieure doit être transmise au constructeur de la classe interne et pour qu'il soit enregistré dans une variable d'instance. P>
Je n'ai personnellement jamais vu un em> la classe em> définie à l'intérieur des méthodes d'une autre classe avant, alors si cela fonctionne réellement, je suis grandement surpris. (Je suis encore plus surpris de savoir pourquoi vous voudriez / besoin de cela, mais de toute façon ...)
Il suffit de passer l'objet actuel (externe) à l'objet intérieur lorsque vous le construisez. P>
class InnerClass { var $outer; function __construct(&$outer) { $this->outer = $outer; } function someStuff() { $this->outer->doStuff(); } } $innerObj = new InnerClass($this);
Il semble que vous devriez faire: mais il semble que vous ne pouvez pas faire cela en PHP: p> extraire votre Classe intérieure hors de la Magrasclass. p> p>
Les classes intérieures ne sont pas possibles dans PHP. Donc, vous ne pouvez pas déclarer votre classement intérique au sein de Magrasclass. Et puisque vous ne pouvez pas faire cela, il n'ya aucun moyen d'accéder aux variables de cours extérieures que vous pouvez, par exemple, Java.
Vous pouvez le faire à la place: P>
class mainclass { var $data; function __construct($data){ $this->data = $data; } function echodata(){ echo $this->data; } function start(){ $inner = new innerclass(); $inner->show($this); } } class innerclass{ function show($mainclass){ $mainclass->echodata();//the problem is here } } $mainclass = new mainclass('maininfostuff'); $mainclass->start();
Permettez-moi d'abord d'abord une ligne importante: en PHP, afin d'utiliser l'opérateur d'accès d'objet infixe ( Si vous venez d'une autre langue et que vous envisagez d'un accès statique, vous devez Utilisez l'opérateur correct, qui est Maintenant, si vous êtes opposé à la transmission de l'objet "Parent" à l'enfant constructeur, vous pouvez envisager un motif singleton, ce qui vous permettrait d'accéder statilement à l'instance (uniquement) de la classe mère de n'importe où dans le code, y compris l'objet enfant. P> mais sérieusement, il suffit de le transmettre Un argument au constructeur et comme quelqu'un d'autre dit, ne définissez pas la classe à l'intérieur d'une fonction, surtout si cette fonction est elle-même membre d'une autre classe. Si cette fonction est appelée deux fois, vous obtiendrez une erreur fatale. P> Voici un exemple de ce dont je parle: P> -> code>) l'argument de gauche doit être une variable (ajustée par au moins un
$ code>) et doit être une instance d'une classe, par exemple
$ myClass-> quel que soit code> ou
$ ceci-> foo code>. p>
:: code>, par exemple
Soméclasse :: $ Quelantaine code> ou
SOMECLASS :: Quelqu'un_const code>. p>
EDIT H2>
$foo = mainClass::getInstance('Foo');
$foo->start(); // prints "Foo"
Merci pour votre réponse, mais j'en ai besoin de travailler sans singletons.
Non, les classes intérieures ne sont pas en PHP. P>
"La fonctionnalité est déjà disponible dans d'autres langues, mais la question est de savoir si elle est nécessaire dans PHP. La réponse courte est non. Avec le modèle d'exécution PHP, il ralentirait davantage la compilation PHP." - http://jacobsantos.com/2006/general / pas-avocat-sous-classes / commentaire-page-1 / p>
J'ai trouvé plus de façons de faire ce et celui-ci aussi, que je préfère, compte tenu de son joli neat. p> et voici une classe de partage d'instance d'objet que je viens de faire :) p> ceci vous permet d'exécuter toute fonction partagée "instance d'objet" de tout objet partagé
Maintenant, MAINLLASCLAS peut inclure / exécuter n'importe quelle classie intérieure qu'il souhaite, tandis que InnerClass a la possibilité d'exécuter des fonctions d'instance de MAINCLASS comme si son objet MAINCLASS déjà démarré P> P>