web-dev-qa-db-fra.com

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 chez l'enfant? le résultat attendu fera écho à "parent bb"

34
Kuntau
echo $this->bb;

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


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

Utilisation parent:: lorsque vous voulez ajouter des fonctionnalités supplémentaires à une méthode de la classe parente. Par exemple, imaginez une classe Airplane:

class Airplane {
    private $pilot;

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

Supposons maintenant que nous voulons créer un nouveau type d'avion qui dispose également d'un navigateur. Vous pouvez étendre la méthode __construct () pour ajouter la nouvelle fonctionnalité, mais toujours utiliser 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 le principe DRY de développement mais toujours fournir toutes les fonctionnalités que vous désirez.

60
George Cummins

Il suffit de l'écho car il est hérité

echo $this->bb;
6
Nicola Peluchetti
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();`
4
user2147836

Avec parent::$bb; vous essayez de récupérer la constante statique 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. Ne déclarez simplement pas __construct en classe B.

3
corretge

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

Vous accédez donc à $ bb comme si c'était un attribut de 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();
2
FinalForm

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 mot-clé protected dans votre classe car cela génère une erreur fatale lorsqu'il est utilisé dans l'enfant classe.
comme mentionné dans php.net

La visibilité d'une propriété ou d'une méthode peut être définie en préfixant la déclaration avec les mots clés public, protected ou private. Les membres du groupe déclarés publics sont accessibles partout. Les membres déclarés protégés ne sont accessibles que dans la classe elle-même et par les classes héritées et parent. Les membres déclarés privés ne sont accessibles qu'à la classe qui définit le membre.

1
Hamed Momeni