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

void __set ( string $name , mixed $value )
mixed __get ( string $name )
bool __isset ( string $name )
void __unset ( string $name )

__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->1;
echo 
$obj->"\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

mixed __call ( string $name , array $arguments )
mixed __callStatic ( string $name , array $arguments )

__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