web-dev-qa-db-fra.com

Comment utiliser les classes internes en PHP?

Je viens d'un arrière-plan Java, et je veux utiliser une classe interne en php. Cependant, chaque fois que je mets la classe interne, j'obtiens une erreur de syntaxe. Est-ce possible avec PHP? , comment référencer la classe externe? Est-ce que j'ai accès à TOUS ses membres de données?

<?php

class OuterClass {
    var $x = 15;
    function __construct() {

    }

    class InnerClass {                  // error when InnerClass is static
        function __construct() {        // error when InnerClass is static
            echo $x;
        }
    }
}

?>

Ceci est utilisé pour une MoveClass (comme pour faire un mouvement) d'un jeu de cartes spécifique. Je pense que ce serait une bonne idée de mettre ces classes ensemble car elles n'ont aucun sens. En outre, la MoveClass doit connaître certains membres de données de la classe Game. Pourquoi ne pas en faire une fonction? C'est tout simplement trop grand.

Éditer:

Qu'en est-il des classes imbriquées? D'après ce que je comprends, ceux-ci doivent être statiques? O_o

32
Lindz

PHP ne permet pas les classes internes. Si vous souhaitez accéder à tous les membres de données de la classe parent, je vous suggère d'utiliser l'héritage.

Une alternative possible:

class OuterClass {
    var $x = 15;
    function __construct() {

    }
}
class ChildClass extends OuterClass {
    function __construct() {
        parent::__construct();
    }
}

Vous pouvez invoquer une méthode de la classe parente en vous référant à la classe elle-même; Dans PHP vous pouvez le faire avec le mot clé parent. Donc, pour faire référence à une méthode dans le contexte d'une classe plutôt qu'à un objet que nous utilisons :: par opposition à ->.

20
Russell Dias

dans PHP 5.4 ou version ultérieure, vous pouvez utiliser PHP Traits qui sont davantage conçus pour l'héritage multiple, mais peuvent répondre à vos besoins. À partir du PHP:

Un trait est similaire à une classe, mais uniquement destiné à regrouper les fonctionnalités de manière fine et cohérente. Il n'est pas possible d'instancier un trait seul. C'est un ajout à l'héritage traditionnel et permet une composition horizontale du comportement; c'est-à-dire l'application des membres de la classe sans exiger d'héritage.

http://php.net/manual/en/language.oop5.traits.php

5
Jason

Comme mentionné dans les commentaires à cette réponse de ne autre question , la version PHP de cette fonctionnalité a été ajoutée dans PHP 7. Il ne semble pas fournir exactement ce que vous demandez, mais il devrait vous fournir un modèle de conception similaire.

Voici le RFC décrivant comment cela fonctionne: https://wiki.php.net/rfc/anonymous_classes

Comme mentionné dans les commentaires de l'autre réponse, recherchez dans la page RFC "imbriqué" pour voir un exemple d'imbrication à l'intérieur d'une classe externe.

2
jason

Vous voudrez peut-être utiliser une stdClass à la place. Voici une SO question à ce sujet: Qu'est-ce que stdClass en PHP?

1
mqsoh

Vous ne pouvez pas imbriquer des classes comme ça.

Regardez la section "étend" de le manuel .

0
simshaun