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"
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.
Il suffit de l'écho car il est hérité
echo $this->bb;
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();`
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.
$ 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();
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.