L'accès aux champs de l'objet peuvent s'effectuer via les fonctions __get() et __set().
private $champs = array('nom_champ1'=> 'valeur', ..., 'nom_champN' => 'valeur');
function __get($nom_champ){
//retourne une valeur
}
function __set($nom_champ, $valeur){
//fixe la valeur d'un champ
}
Les fonctions __get() et __set() possèdent un paramètre commun, en l'occurrence le nom du champ invoqué par le biais d'un objet. Le second paramètre de __set() est la valeur qui devra être affectée au champ déterminé par son nom. La fonction __get() a la charge de retourner la valeur de ce champ.
Le tableau associatif est chargé de contenir l'ensemble des champs qui pourront être accédés ou fixés par les fonctions de surcharge.
Ce concept de programmation objet s'appele l'encapsulation, c'est-à-dire la capacité d'une classe à masquer les méthodes et les données internes (son implémentation) qu'il n'est pas nécessaire de rendre visible. En conséquence, les champs publics n'ont aucun intérêt à utiliser cette technique, seuls ceux ayant une visibilité limité (private ou protected) sont concernés.
class Coordonnees {
private $point = array('x' => 1, 'y' => 2, 'z' => 3);
function __get($nom) {
if (isset($this->point[$nom])) {
$val = $this->point[$nom];
return $val;
}
else {
return Null;
}
}
function __set($nm, $val) {
if (isset($this->point[$nom])) {
$this->point[$nom] = $val;
}
}
}
$coord = new Coordonnees();
//Appels implicites de __set()
$coord->x = 10;
$coord->y = 100;
$coord->z = 15;
//Appels implicites de __get()
print('x = ' . $coord->x);
print('y = ' . $coord->y);
print('z = ' . $coord->z);