Les classes et les objets
PHP Manual

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 dans les contexte objet. Ces méthodes magiques ne seront pas lancées dans un contexte statique. Par conséquent, ces méthodes ne devraient pas être déclarées comme statiques. Depuis PHP 5.3.0, une alerte est levée si une des méthodes magiques est déclarée statique.

Note: La valeur retournée par __set() est ignoré en raison de la façon dont le processus PHP assigne les opérateurs. De la même façon, __get() n'est jamais appelé lors d'un enchaînement d'assignements, comme ceci :

 $a = $obj->b = 8; 

Exemple #1 Exemple de surcharge de propriétés avec les méthodes __get(), __set(), __isset() et __unset()

<?php
class PropertyTest {
    
/**  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 PropertyTest;

$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

Les classes et les objets
PHP Manual