PHP : modifier les attributs privés d'un objet

Utilisation des fonctions anonymes pour accéder aux attributs protégés d'une instance.

28 décembre 2016

Pour modifier ou simplement accéder à un attribut privé ou protégé d'un objet, il suffit de créer une fonction anonyme et de les lier ensemble. La méthode Closure::bindTo de PHP, si on lui passe l'objet en premier et second paramètre, permet de simuler l'appartenance de notre nouvelle fonction à cet objet : ainsi $this référencera bien l'objet.

Modifier un attribut déclaré private ou protected

class Foo {
   private $bar = 42;

   public function getBar() {
      return $this->bar;
   }
}

$foo = new Foo;

$modify_bar = function() {
   $this->bar = 43;
};

$modify_bar = $modify_bar->bindTo($foo, $foo);

$modify_bar();

/* Display: int(43) */
var_dump($foo->getBar());

/* Version statique : */

class Foo {
    protected static $bar = 42;

    public static function getBar() {
        return static::$bar;
    }
}

$modify_bar = static function() {
    static::$bar = 43;
};

$modify_bar = $modify_bar->bindTo(null, 'Foo');

$modify_bar();

/* Display: int(43) */
var_dump(Foo::getBar());

Bien sûr, c'est à utiliser avec parcimonie, pour des cas de tests par exemple. Si ces attributs ont été protégés, il y a sûrement une bonne raison.

A bientôt .

Par
Créateur et administrateur.

Dans la même catégorie

Formater un tableau pour CURLOPT_POSTFIELDS
Email avec pièce jointe en PHP
Tester l'existence d'un fichier dans l'include path
Convertir récursivement un objet PHP en tableau
PHP : formater un tableau en CSV
Comment envoyer un mail en ligne de commande ?
RSYNC : Comment synchroniser des fichiers à travers une connexion ssh ?
Exécuter un code PHP en ligne de commande
Doctrine 2 : générer les classes PHP depuis la base de données
Comment catcher les erreurs en PHP ?
Doctrine 2 : comment afficher la requête SQL ?
Comment construire une URL sans caractères spéciaux en PHP ?
Comment lister les fichiers PHP inclus sur ma page ?
Les fonctions anonymes récursives en PHP
Requête HTTP asynchrone en PHP
La résolution statique à la volée ou Late Static Bindings
Trouver les jours fériés français en PHP
Comment allumer son ordinateur à distance en PHP ?
Comment utiliser la balise meta viewport ?
Une version mobile de mon site avec le Zend Framework
Doctrine et le Zend Framework : Présentation, intégration et utilisation
Créer son flux RSS simplement avec Zend_Feed
Appliquer un layout sur un mail avec le Zend Framework
Comment lancer une requête multi-bases avec les fonctions MySQL ?
Implode / Explode : Du tableau à la chaine de caractères, de la chaine de caractères au tableau

Commentaire(s)