Forum de la C-P-F

Version complète: [PHP5] Simuler des accesseurs
Vous regardez actuellement la version basse qualité d'un document. Voir la version complète avec le bon formatage.
Ceci est une copié éhontée de http://virginie.mathey.co.uk/index.php?2...urs-en-php parce que je ne tient pas à perdre ce tutorial

Tout développeur sait qu'après l'écriture des attributs d'une classe vient la fastidieuse tâche de rédaction des accesseurs. Alors, plutôt que de perdre son temps à faire un get et un set par attribut pourquoi ne pas simuler les accesseurs et en écrire seulement deux génériques ?

Pour ce faire, il faut connaître la méthode __call de PHP. Cette dernière permet d'attraper tout appel à une méthode inexistante.

L'exemple de code suivant permet d'accèder aux attributs lastname, firstname et age en simulant les get et set correpondant:

La class utils qui simule les accesseurs:
Code PHP :
abstract class utils
{
        public function __call( $_method, $_attributes )
        {
                $prefix = substr( $_method, 0, 3 );
                $suffix = substr( $_method, 4 );
                $c_attributes = count( $_attributes );
               
                if( property_exists( $this, $suffix ) )
                {
                        if( $prefix == 'set' && $c_attributes )
                        {
                                return $this->set( $suffix, $_attributes[0] );
                        }
                        if( $prefix == 'get' && !$c_attributes )
                        {
                                return $this->get( $suffix );
                        }
                }
               
                else
                {
                        trigger_error( "The method ". $_method ." does not exist",
                                                E_USER_ERROR );
                }
        }
}


La classe possèdant les attributs:
Code PHP :
require 'utils.php'

class user extends utils
{
        // Attributs

        protected $lastname;
        protected $firstname;
        protected $age;

        // Get et Set génériques

        public function get( $_v )
        {
                return $this->$_v;
        }

        public function set( $_v, $_a )
        {
                $this->$_v = $_a;
        }
}


Création d'un objet et accès aux attributs (appel des accesseurs simulés):
Code PHP :
// Création d'un objet user
$paul = new user();

// Affectation des attributs
$paul->set_lastname( "dupont" );
$paul->set_firstname( "arnaud" );
$paul->set_age( 25 );

// Lecture des attributs
echo "Nom: " . $paul->get_lastname() . "
"
;
echo "Prénom: " . $paul->get_firstname() . "
"
;
echo "Age: " . $paul->get_age() . "
"
;


Note: La classe utils étant une classe abstraite tous les attributs privés (plutôt que protected) n'auront pas d'accesseurs simulés.
URLs de référence