MÉTHODES MAGIQUES
Une méthode magique s'écrit toujours avec un double underscore __ en amont.
Les méthodes magiques ne sont pas pré-définies. C'est à nous de la définir.
Elles sont appelées automatiquent lorsqu'un évènement se produit.
Il existe plusieurs fonctions magiques, nous allons ici en lister quelques unes: function __call, __get, __set, __isset, unset, toString, __invoke.
(ou function __callStatic)
-> Repère et s'execute si une méthode n'existe pas ou n'est pas accessible depuis un certain objet
-> Reçoit deux arguments: le premier argument fait référence à la méthode, le deuxième au(x) paramètre(s).
-> Les paramètres sont affichables grâce à la fonction implode.
Exemple avec une class Users et function __call :
Afin de se concentrer sur l'essentiel, je ne mettrait plus tout le code dans ce chapitre, mais que les méthodes.
class Users{
........
public function __call($methode, $argument){
echo 'La métode ' . $methode . ' n\'existe pas.< br /> Argument(s) ' . implode(', ', $argument) . ' invalide(s)'.
}
}
Nouvel Objet :
$users1 = new Users('Dupont', 'Paul', 29, 'paul@gmail.com');
Essai de se servir d'une méthode qui n'existe pas dans Users
users1->listeAttributs(val1, val2);
La méthode listeAttributs n'existe pas.
Argument(s) val1, val2 invalide(s).
-> Repère et s'execute si une attribut n'existe pas ou n'est pas accessible(pivate).
-> Reçoit un argument: fait référence l'attribut souhaité.
Exemple avec une class Users et function __get :
class Users{
........
public function __get($argument){
echo 'L'attribut' ' . $argument . ' n\'existe pas.< br />.'
}
}
Nouvel Objet :
$users1 = new Users('Dupont', 'Paul', 29, 'paul@gmail.com');
Essai de se servir d'un attribut private ou qui n'existe pas.
echo users1->telephone;
L'attribut telephone n'existe pas ou est innaccessible.
-> S'execute si l'on essaie de créer ou mettre à jour un attribut innaccessible ou innexistant.
-> Reçoit deux arguments: le premier fait référence au nom, le deuxième à la valeur de l'attribut'.
Exemple avec une class Users et function __set :
class Users{
........
public function __set($attribut, $val){
echo 'Impossible de mettre à jour l'attribut: ' . $attribut . ' avec la valeur ' . $val . ' car cet attribut n\'existe pas ou est innaccessible.< br />.'
}
}
Nouvel Objet :
$users1 = new Users('Dupont', 'Paul', 29, 'paul@gmail.com');
Essai de mettre à jour un attribut privé.
users1->prenom = 'Martin';
Impossible de mettre à jourt l'attribut: prenom avec la valeur: Martin car cet attribut n'existe pas ou est innaccessible.
-> S'execute si l'on essaie d'acceder avec isset à un attribut innaccessible ou innexistant.
-> Reçoit un argument: fait référence à l'attribut.
Exemple avec une class Users et function __isset :
class Users{
........
public function __isset($attribut ){
echo 'Attribut: ' . $attribut . ' innaccessible ou innexistant.< br />.'
}
}
Nouvel Objet :
$users1 = new Users('Dupont', 'Paul', 29, 'paul@gmail.com');
Essai d'acceder à un attribut avec isset
if(isset($users1->nom)) { echo 'Il existe'; }
} else { echo 'Il n'existe pas'; }
Attribut: nom innaccessible ou innexistant.
Il n'existe pas
-> S'execute si l'on essaie de détruire un attribut innaccessible ou innexistant.
-> Reçoit un argument: fait référence à l'attribut.
Exemple avec une class Users et function __unset :
class Users{
........
public function __unset($attribut ){
echo 'Impossible de détruire l'attribut: ' . $attribut . ' car il est innaccessible ou innexistant.< br />.'
}
}
Essai de détruire un attribut avec unset
unset(users1->adresse );
Impossible de détruire l'attribut: adresse car il est innaccessible ou innexistant.
Si l'on détruit un attribut et que l'on essai de lui attribuer une valeur
L'attribut fonction a été ajouté en public pour l'exemple
unset(users1->fonction);
users1->fonction = 'Valeur1';
Impossible de mettre à jourt l'attribut: fonction avec la valeur: Valeur1 car cet attribut n'existe pas ou est innaccessible.
-> S'execute si l'on essaie d'acceder directement à un objet et non à la valeur des attributs de l'objet.
-> Ne reçoit pas d'argument.
Exemple avec une class Users et function __toString :
class Users{
........
public function __toString( ){
return 'L'objet dont le nom est: '. $this->nom .' est un objet et non une chaîne de caractère.< br />.'
}
}
Essai d'acceder à un objet avec toString
echo users1;
L'objet dont le nom est: Dupont est un objet et non une chaine de caractère.
-> S'execute si l'on essaie d'utiliser un objet comme une fonction.
-> Reçoit un argument.
Exemple avec une class Users et function __invoke :
class Users{
........
public function __invoke( ){
echo 'Vous êtes en train d\'utiliser un objet comme une fonction et vous avez utilisé comme argument '. $arg .'.
}
}
Essai d'acceder à un objet avec toString
users1(43);
Vous êtes en train d'utiliser un objet comme une fonction et vous avez utilisé comme argument 43.