23/10/2007, 15:13
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:
La classe possèdant les attributs:
Création d'un objet et accès aux attributs (appel des accesseurs simulés):
Note: La classe utils étant une classe abstraite tous les attributs privés (plutôt que protected) n'auront pas d'accesseurs simulés.
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.