6
votes

objet PHP dans l'objet, obtenant l'instance d'objet de niveau supérieur

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?

Sons Confusion, alors voici un exemple:

contenu de l'index xxx

contenu de innerclass.php xxx

Le but de ce cas d'essai est de rendre la classe interne décider si / quand exécuter la fonction ECHODATA principale

Comment l'exemple ci-dessus peut-il être accompli? (Sans s'appuyer sur des classes statiques ou des singletons ou des classes étendues)

EDIT: En raison de la confusion dans les réponses, j'ai édité l'exemple


0 commentaires

8 Réponses :


2
votes

non. Lorsque vous créez un objet en tant que membre d'un autre objet: XXX

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: xxx

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 étend . Une classe peut étendre un autre. Leur définition est toujours côte à côte, elles ne sont pas imbriquées dans le code.

Je ne sais pas ce que vous essayez de faire, mais peut-être que ce que vous recherchez est 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é parent xxx

C'est quelque chose fondamentalement différent de celui de Ce que tu fais en ce moment.


0 commentaires

5
votes

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.


0 commentaires

5
votes

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);


0 commentaires

2
votes

Il semble que vous devriez faire: xxx

mais il semble que vous ne pouvez pas faire cela en PHP: xxx

extraire votre Classe intérieure hors de la Magrasclass.


0 commentaires

9
votes

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();


0 commentaires

2
votes

Permettez-moi d'abord d'abord une ligne importante: xxx pré>

en PHP, afin d'utiliser l'opérateur d'accès d'objet infixe ( -> 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>

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 :: code>, par exemple Soméclasse :: $ Quelantaine code> ou SOMECLASS :: Quelqu'un_const code>. p>

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>

EDIT H2>

Voici un exemple de ce dont je parle: P>

$foo = mainClass::getInstance('Foo');
$foo->start(); // prints "Foo"


1 commentaires

Merci pour votre réponse, mais j'en ai besoin de travailler sans singletons.



4
votes

Non, les classes intérieures ne sont pas en PHP.

"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 /


0 commentaires

1
votes

J'ai trouvé plus de façons de faire ce xxx

et celui-ci aussi, que je préfère, compte tenu de son joli neat. xxx

et voici une classe de partage d'instance d'objet que je viens de faire :) xxx

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é


0 commentaires