Surcharge
La surcharge en PHP permet de cr�er dynamiquement des propri�t�s 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 propri�t�s 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 "propri�t�s 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.
Historique
Version | Description |
---|---|
5.3.0 | Ajout de __callStatic(). Ajout d'un avertissement pour forcer la visibilit� public et la d�claration non static. |
5.1.0 | Ajout de __isset() et de __unset(). |
Surcharge des propri�t�s
__set() est sollicit�e lors de l'�criture de donn�es vers des propri�t�s inaccessibles.
__get() est sollicit�e pour lire des donn�es depuis des propri�t�s inaccessibles.
__isset() est sollicit�e lorsque isset() ou la fonction empty() sont appel�s avec des propri�t�s inaccessibles.
__unset() est sollicit�e lorsque unset() est appel�e avec des propri�t�s inaccessibles.
L'argument $name est le nom du propri�t� qui interagit. L'argument $value de la m�thode __set() sp�cifie la valeur du propri�t� $name qui doit �tre d�finie.
La surcharge des propri�t�s 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 propri�t�s d�clar�s. */
public $declared = 1;
/** La surcharge n'est lanc�e que lorsque l'on acc�de � la classe depuis l'ext�rieur. */
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 via __get(): ' . $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() {
return $this->hidden;
}
}
echo "<pre>\n";
$obj = new MemberTest;
$obj->a = 1;
echo $obj->a . "\n\n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";
echo $obj->declared . "\n\n";
echo "Manipulons maintenant la propri�t� priv�e nomm�e 'hidden':\n";
echo "'hidden' est visible depuis la classe, donc __get() n'est pas utilis�...\n";
echo $obj->getHidden() . "\n";
echo "'hidden' n'est pas visible en dehors de la classe, donc __get() est utlis�...\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 Manipulons maintenant la propri�t� priv�e nomm�e 'hidden': 'hidden' est visible depuis la classe, donc __get() n'est pas utilis�... 2 'hidden' n'est pas visible en dehors de la classe, donc __get() est utlis�... R�cup�ration de 'hidden' Notice: Propri�t� non-d�finie via __get(): hidden dans <file> � la ligne 64 dans <file> � la ligne 28
Surcharge de m�thode
__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 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