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 de B 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) {
            ...
        }
    }
}
php
2
francadaval 27 juin 2016 à 16:18

2 réponses

Meilleure réponse

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

4
Devon 27 juin 2016 à 16:33

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());
2
André Ferraz 27 juin 2016 à 16:35