Dans cet exemple, j'ai supposé que la fonction getVars
appelée depuis data
serait capable de renvoyer les noms de vars privés de B
car $this
est une instance de B
.
Au lieu de cela, $this->getVars()
renvoie un tableau vide.
get_object_vars
n'est-il pas appelé des variables privées visibles ?getVars
n'est-il pas une méthode héritée deB
et appelée comme si elle y était déclarée ?- Comment puis-je obtenir des noms de variables privées à partir d'une méthode déclarée dans une classe abstraite ?
Exemple:
abstract class A
{
public function getVars()
{
return get_object_vars($this);
}
}
class B extends A
{
private $a;
private $b;
private $c;
public function data()
{
...
foreach($this->getVars() as $var) {
...
}
}
}
2 réponses
Les propriétés privées ne sont disponibles que pour les méthodes de cette classe. Essayez d'utiliser des propriétés protégées pour vous assurer que les méthodes héritées y ont accès.
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 de la classe déclarés publics sont accessibles partout. Les membres déclarés protégés ne sont accessibles qu'au sein de la classe elle-même et par les classes héritées. Les membres déclarés comme privés ne sont accessibles que par la classe qui définit le membre.
http://php.net/manual/en/language.oop5.visibility.php
Oui, car get_object_vars
est sensible à la portée. Si vous ne souhaitez pas modifier la visibilité des variables, appelez get_object_vars
directement depuis la fonction data()
.
Si vous souhaitez conserver l'héritage du code tel qu'il est, vous devrez modifier la visibilité des variables sur protected.
abstract class A
{
public function getVars()
{
return get_object_vars($this);
}
}
class B extends A
{
protected $a;
protected $b;
protected $c;
public function data()
{
return $this->getVars();
}
}
$a = new B();
print_r($a->data());
Questions connexes
De nouvelles questions
php
PHP est un langage de script largement utilisé, de haut niveau, dynamique, orienté objet et interprété, principalement conçu pour le développement Web côté serveur. Utilisé pour les questions sur le langage PHP.