PHP accès à la Variable de classe Parent

class A {
    private $aa;
    protected $bb = 'parent bb';

    function __construct($arg) {
       //do something..
    }

    private function parentmethod($arg2) {
       //do something..
    }
}

class B extends A {
    function __construct($arg) {
        parent::__construct($arg);
    }
    function childfunction() {
        echo parent::$bb; //Fatal error: Undefined class constant 'bb' 
    }
}

$test = new B($some);
$test->childfunction();

Question: Comment afficher la variable parent dans l'enfant? résultat escompté echo 'parent bb'

30
demandé sur Kuntau 2011-06-23 19:49:06

6 réponses

echo $this->bb;

la variable est héritée et n'est pas privée, elle fait donc partie de l'objet courant.


Voici des renseignements supplémentaires en réponse à votre demande pour plus d'informations sur l'utilisation de parent:::

Utiliser parent:: quand vous voulez ajouter fonctionnalité supplémentaire à une méthode de la classe parent. Par exemple, imaginez un Airplane catégorie:

class Airplane {
    private $pilot;

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

Maintenant, supposons que nous voulons créer un nouveau type d'Avion dispose également d'une Navigator. Vous pouvez étendre la méthode _ _ construct () pour ajouter la nouvelle fonctionnalité, mais utilisez quand même la fonctionnalité offerte par le parent:

class Bomber extends Airplane {
    private $navigator;

    public function __construct( $pilot, $navigator ) {
        $this->navigator = $navigator;

        parent::__construct( $pilot ); // Assigns $pilot to $this->pilot
    }
}

De cette façon, vous pouvez suivre l' principe DRY de développement tout en fournissant toutes les fonctionnalités que vous désirez.

54
répondu George Cummins 2013-10-10 23:32:50

Juste l'écho depuis héritées

echo $this->bb;
6
répondu Nicola Peluchetti 2013-11-22 10:34:15
class A {
    private $aa;
    protected $bb = 'parent bb';

    function __construct($arg) {
       //do something..
    }

    private function parentmethod($arg2) {
       //do something..
    }
}

class B extends A {
    function __construct($arg) {
        parent::__construct($arg);
    }
    function childfunction() {
        echo parent::$this->bb; //works by M
    }
}

$test = new B($some);
$test->childfunction();`
5
répondu user2147836 2014-09-04 22:40:58

parent::$bb; vous essayez de récupérer la statique constante définie avec la valeur de $bb.

au lieu de cela, faites:

echo $this->bb;

Remarque: vous n'avez pas besoin d'appeler parent::_construct si B est la seule classe qui l'appelle. Suffit de ne pas déclarer __construire dans la classe B.

3
répondu corretge 2013-01-15 09:02:16

$bb est maintenant devenu le membre privé de la Classe B après avoir étendu la classe A où il était protégé.

donc vous accédez à $bb comme si c'était un attribut de la classe B.

class A {
    private $aa;
    protected $bb = 'parent bb';

    function __construct($arg) {
       //do something..
    }

    private function parentmethod($arg2) {
       //do something..
    }
}

class B extends A {
    function __construct($arg) {
        parent::__construct($arg);
    }
    function childfunction() {
        echo $this->bb; 
    }
}

$test = new B($some);
$test->childfunction();
1
répondu FinalForm 2011-06-23 15:59:38

toutes les propriétés et méthodes de la classe parent sont héritées dans la classe enfant donc théoriquement vous pouvez y accéder dans la classe enfant mais attention en utilisant le protected mot-clé dans votre classe parce qu'il provoque une erreur fatale lorsqu'il est utilisé dans la classe enfant.

comme indiqué dans le php.net

La visibilité d'une propriété ou d'une méthode peut être défini par le préfixe déclaration avec les mots-clés public, protected ou private. Les membres de la classe accès au public déclaré partout. Membres déclarés protégés accessible uniquement dans la classe elle-même et par héritage et parent classe. Membres déclarés privés ne peut être accédé que par la classe qui définit le membre.

0
répondu Hamed Momeni 2011-06-23 15:59:03