2017-08-24 5 views
-1

J'ai eu de la difficulté à trouver des guides à ce sujet, alors j'ai pensé que je demanderais ici.Itérer sur des variables protégées dans une classe php

J'ai des objets, ces objets ont tous des variables protégées. Ces variables sont protégées parce que je les veux lisibles, mais seulement certaines d'entre elles sont modifiables et je veux les filtrer quand elles sont définies. Pour ce faire, j'ai créé la classe suivante, à partir de laquelle toutes les autres classes qui correspondent à cette conception s'étendent:

abstract class UnitObject{ 
    protected $setables = []; 

    abstract public function filter($value); 

    public function __set($name, $value) 
    { 
     if (in_array($name, $this->setables)) { 
      $this->{$name} = $this->filter($value); 
     } else { 
      /* 
      * Log something 
      */ 
     } 
    } 

    public function __get($name) 
    { 
     return $this->{$name}; 
    } 
} 

Maintenant, ce accomplit le résultat souhaité. Je voudrais, cependant, que ces variables protégées soient accessibles via une boucle foreach pour itérer sur les propriétés de l'objet. Comme ils ne sont pas "visibles" dans le sens traditionnel, le code par défaut ne semble pas fonctionner pour cela. Après quelques recherches, j'ai découvert que je peux implémenter Iterator pour accomplir quelque chose comme ça, mais tous les exemples sont si je l'ai implémenté sur l'objet spécifique.

Mon but est d'implémenter l'itérateur sur mon "UnitObject" dont mes enfants héritent, et d'écrire les méthodes requises pour qu'elles tournent à travers toutes les variables de cet objet lorsqu'une boucle foreach est utilisée. Donc mes questions sont les suivantes:

  1. La mise en œuvre de l'itérateur est-elle la meilleure technique pour résoudre ce problème?
  2. Est-il possible d'utiliser une classe parente abstraite qui implémente Iterator et dont la classe contient les fonctions requises, ou ai-je besoin de créer les fonctions requises pour chaque objet spécifique?
  3. Enfin, si c'est possible, pourriez-vous donner un exemple ou me diriger vers une source qui a un bon exemple?

Merci!

+0

Il suffit de mettre en place des setters appropriés comme un adulte, au lieu d'abuser du trou noir de la complexité, qui sont magiques "__set" et "__get". Aussi, le suffixe "object" est ... emm ... choix douteux. –

+0

Demandez-vous si vous avez vraiment besoin de cette complexité. Pourquoi ne pas avoir une fonction qui retourne les variables en tableau? – ryantxr

+0

Merci pour les commentaires, malheureusement cette fonctionnalité est requise. Cela fait partie d'un cadre qui est en cours d'élaboration pour un système beaucoup plus vaste. L'utilisation des fonctions magiques permet de contrôler la portée sans avoir à écrire des getters et des setters pour des centaines de variables distinctes. – cast2022

Répondre

0

ryantxr, merci d'avoir été assez proche de ce que j'avais besoin de faire. J'ai trouvé une solution après être devenu plus compétent avec l'implémentation de l'itérateur. Voici le code que j'ajouté à ma classe abstraite UnitObject:

/* 
    * Functions to allow protected and private variables to be iterated over 
    */ 

    private $variablePosition = 0; 
    private $variableArray = []; 

    public function rewind() 
    { 
     $this->variableArray = array_keys(get_object_vars($this)); 
     $this->variablePosition = 0; 
    } 

    public function current() 
    { 
     return $this->{$this->key()}; 
    } 

    public function key() 
    { 
     return $this->variableArray[$this->variablePosition]; 
    } 

    public function next() 
    { 
     ++$this->variablePosition; 
    } 

    public function valid() 
    {   
     return isset($this->variableArray[$this->variablePosition]); 
    } 

*Note: I also had to implement Iterator on my UnitObject class 

Cela permet maintenant mes objets qui étendent ma classe abstraite pour itérer sur les variables protégées.