La surcharge en PHP permet de créer dynamiquement des membres et des méthodes. Ces entités dynamiques sont traitées via mes méthodes magiques établies dans une classe pour diverses types d'actions.
Les méthodes surchargées sont appelées lors de l'interaction avec les membres et les méthodes qui n'ont pas été déclarés ou ne sont pas visibles dans le contexte courant. Le reste de cette section utilise les termes de "membres inaccessibles" et de "méthodes inaccessibles" pour se référer à cette combinaison de déclaration et de visibilité.
Toutes les méthodes surchargées doivent être définies comme public.
Note: Aucun des arguments de ces méthodes magiques ne peut être passé par référence.
Note: L'interprétation PHP de la "surcharge" est différente de la plupart des langages orientés objet. La surcharge, habituellement, fournit la possibilité d'avoir plusieurs méthodes portant le même nom mais avec une quantité et des types différents d'arguments.
Version | Description |
---|---|
5.1.0 | Ajout de __isset() et de __unset(). |
5.3.0 | Ajout de __callStatic(). |
__set() est exécuté lors de l'écriture de données vers des membres inaccessibles.
__get() est utilisé pour lire des données depuis des membres inaccessibles.
__isset() est lancé en appelant la fonction isset() ou la fonction empty() sur des membres inaccessibles.
__unset() est appelé lorsque unset() est appelé sur des membres inaccessibles.
L'argument $name est le nom du membre qui interagit. L'argument $value de la méthode __set() spécifie la valeur du membre $name qui doit être définie.
La surcharge des membres ne fonctionne que sur des objets du contexte. Ces méthodes magiques ne seront pas lancées dans un contexte statique. Par conséquent, ces méthodes ne peuvent être déclarées comme statiques.
Exemple #1 Exemple de surcharge avec __get, __set, __isset et __unset
<?php
class MemberTest {
/** Variable pour les données surchargées. */
private $data = array();
/** La surcharge n'est pas utilisée sur les membres déclarés. */
public $declared = 1;
/** La surcharge n'est pas lancée lorsque l'on accède à la classe. */
private $hidden = 2;
public function __set($name, $value) {
echo "Définition de '$name' à la valeur '$value'\n";
$this->data[$name] = $value;
}
public function __get($name) {
echo "Récupération de '$name'\n";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
$trace = debug_backtrace();
trigger_error(
'Propriété non-définie : ' . $name .
' dans ' . $trace[0]['file'] .
' à la ligne ' . $trace[0]['line'],
E_USER_NOTICE);
return null;
}
/** Depuis PHP 5.1.0 */
public function __isset($name) {
echo "Est-ce que '$name' est défini ?\n";
return isset($this->data[$name]);
}
/** Depuis PHP 5.1.0 */
public function __unset($name) {
echo "Effacement de '$name'\n";
unset($this->data[$name]);
}
/** Ce n'est pas une méthode magique, nécessaire ici que pour l'exemple. */
public function getHidden() {
echo "'hidden' visible ici, donc __get() non utilisé\n";
return $this->hidden;
}
}
echo "<pre>\n";
$obj = new MemberTest;
$obj->a = 1;
echo $obj->a . "\n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo $obj->declared . "\n";
echo $obj->getHidden() . "\n";
echo $obj->hidden . "\n";
?>
L'exemple ci-dessus va afficher :
Définition de 'a' à '1' Récupération de 'a' 1 Est-ce que 'a' est défini ? bool(true) Effacement de 'a' Est-ce que 'a' est défini ? bool(false) 1 'hidden' visible ici, donc __get() non utilisé 2 Récupération de 'hidden' Notice: Propriété non-définie : hidden dans <file> à la ligne 64 dans <file> à la ligne 28
__call() est lancé lorsque l'on invoque des méthodes inaccessibles dans le contexte de l'objet.
__callStatic() est lancé lorsque l'on invoque des méthodes inaccessibles dans un contexte statique.
L'argument $name est le nom de la méthode appelée. L'argument $arguments est un tableau contenant les paramètres passés à la méthode $name.
Exemple #2 Surcharge de méthodes instanciées avec __call et ___callStatic
<?php
class MethodTest {
public function __call($name, $arguments) {
// Note : la valeur de $name est sensible à la casse.
echo "Appel de la méthode '$name' "
. implode(', ', $arguments). "\n";
}
/** Depuis PHP 5.3.0 */
public static function __callStatic($name, $arguments) {
// Note : la valeur de $name est sensible à la casse.
echo "Appel de la méthode statique '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
$obj->runTest('dans un contexte objet');
MethodTest::runTest('dans un contexte statique'); // Depuis PHP 5.3.0
?>
L'exemple ci-dessus va afficher :
Appel de la méthode 'runTest' dans un contexte objet Appel de la méthode statique 'runTest' dans un contexte statique