La POO, les méthodes magiques
PHP propose des fonctions prédéfinies utiles dans la programmation objet :
Constructeur : __construct(). Cette méthode est appelée au moment de la création de l’objet.
class Soda{
public $marque;
function __construct($marque) {
$this->marque = $marque;
}
}
$mabouteille = new Soda('coca');
echo $mabouteille->marque;
Affichage
coca
Destructeur : __destruct(). Cette méthode est appelée au moment de la destruction de l’objet. Cette méthode ne doit pas avoir d’argument.
class Soda{
public $marque;
function __construct($marque) {
$this->marque = $marque;
}
function __destruct() {
echo "référence détruite";
}
}
$mabouteille = new Soda('coca');
echo $mabouteille->marque;
echo '<br>';
$mabouteille = null; // on détruit la référence
Affichage
coca
référence détruite
Surcharge : __set(). Cette méthode est appelée au moment de la création d’une propriété dynamique de l’objet.
class Soda{
public $marque;
private $prop = [];
function __construct($marque) {
$this->marque = $marque;
}
function __set($name, $value) {
$this->prop[$name] = $value;
}
}
$mabouteille = new Soda('coca');
echo $mabouteille->volume = '2L';
echo $mabouteille->volume;
Affichage
2L
Surcharge : __get(). Cette méthode est appelée au moment de la consultation d’une propriété créée dynamiquement sur l’objet.
class Soda{
public $marque;
private $prop = [];
function __construct($marque) {
$this->marque = $marque;
}
function __get($name) {
echo "Récupération de la proriété $name";
if (array_key_exists($name, $this->prop)) {
echo $this->prop[$name];
}else{
echo "<br>propriété non existante";
}
}
}
$mabouteille = new Soda('coca');
echo $mabouteille->volume;
Affichage
Récupération de la proriété volume
propriété non existante
Linéarisation : __sleep(). Cette méthode est appelée avant toute linéarisation (conversion de données en chaîne avec la fonction serialize() ). Son rôle et de retourner un tableau avec les noms de toutes les variables de l’objet qui doivent être linéarisées .
class Soda{
public $marque;
private $prop = [];
function __construct($marque) {
$this->marque = $marque;
}
function __sleep() {
echo 'objet sérialisé';
return array('dsn', 'username', 'password');
}
}
$mabouteille = new Soda('coca');
$serialisation = serialize($mabouteille); // sérialisation
Affichage
objet sérialisé
Linéarisation : __wakeup(). Cette méthode est réciproque à __sleep() et est appelée pour la reconstruction des données (avec la fonction unserialize() )
class Soda{
public $marque;
private $prop = [];
function __construct($marque) {
$this->marque = $marque;
}
function __sleep() {
echo 'objet sérialisé';
return array('dsn', 'username', 'password');
}
function __wakeup() {
echo '<br>objet reconstruit';
}
}
$mabouteille = new Soda('coca');
$serialisation = serialize($mabouteille);
unserialize($serialisation); // reconstruction
Affichage
objet sérialisé
objet reconstruit
Conversion : __toString(). Cette méthode est appelée lorque l’objet est traitée comme une chaîne (echo $maVoiture, par exemple).
class Soda{
public $marque;
private $prop = [];
function __construct($marque) {
$this->marque = $marque;
}
function __toString() {
return $this->marque;
}
}
$mabouteille = new Soda('coca');
echo $mabouteille;
Affichage
coca
Méthodes inaccessibles : __call(). Cette méthode est appelée lorsque vous appelez une méthode qui n’existe pas sur une objet.
class Soda{
public $marque;
private $prop = [];
function __construct($marque) {
$this->marque = $marque;
}
public function __call($name, $arguments){
echo "Appel de la méthode '$name' - arguments : "
. implode(', ', $arguments);
}
}
$mabouteille = new Soda('coca');
echo $mabouteille->donneVolume('litre');
Affichage
Appel de la méthode 'donneVolume' - arguments : litre
Méthodes inaccessibles : __callStatic(). Cette méthode est appelée lorsque vous appelez une méthode qui n’existe pas dans un contexte statique (méthode appelée directement à partir de la classe sans passer par l’objet).
class Soda{
public $marque;
private $prop = [];
function __construct($marque) {
$this->marque = $marque;
}
public static function __callStatic($name, $arguments){
echo "Appel de la méthode static '$name' - arguments : "
. implode(', ', $arguments);
}
}
Soda::donneVolume('litre');
Affichage
Appel de la méthode static 'donneVolume' - arguments : litre