Surcharge d'opérateurs PHP (operator overloading)
Posté le Thursday 18 July 2013 | Catégories : PHP
Certains langages de programmation, comme C++, autorisent la surcharge d'opérateur (ou operator overloading). Cela signifie qu'il est possible de fournir une implémentation différente des opérateurs classiques (comme +, -, * etc.) en fonction du type des arguments. Avec la version de base de PHP, ce n'est pas possible, et le code suivant produit comme résultat "2".
class Test
{
    public $value = 0;
   
    public function __construct($v) {
        $this->value = $v;
    }
}
$obj1 = new Test(2);
$obj2 = new Test(12);
var_dump($obj1 + $obj2);
 
Il existe cependant une extension PECL qui rend la surcharge d'opérateur possible. Son nom est simplement "operator". Pour l'installer:
sudo pecl install operator
Pour surcharger l'opérateur + par exemple, il faut que la classe implémente la méthode __add($argument2):
class Test
{
    public $value = 0;
   
    public function __construct($v) {
        $this->value = $v;
    }
   
    public function __add(Test $argument2) {
       
        return new Test($this->value + $argument2->value);
    }
}
$obj1 = new Test(2);
$obj2 = new Test(12);
var_dump($obj1 + $obj2);
 
L'exemple ci-dessus produit cette fois comme résultat un nouvel objet, de valeur 14:
object(Test)#3 (1) {
  ["value"]=>
  int(14)
}
De la même façon, il est possible de surcharger la plupart des opérateurs PHP:
| Opérateurs | Méthodes | 
|---|---|
| + | __add | 
| - | __sub | 
| * | __mul | 
| / | __div | 
| % (modulo) | __mod | 
| . (concaténation) | __concat | 
| $a++ (post-incrémentation) | __post_inc | 
| $a-- | __post_dec | 
| ++$a (pré-incrémentation) | __pre_inc | 
| --$a | __pre_dec | 
| Opérateurs logiques | Méthodes | 
| < (et >) | __is_smaller | 
| <= (et =>) | __is_smaller_or_equal | 
| === (identique) | __is_identical | 
| !== | __is_not_identical | 
| == (égalité) | __is_equal | 
| != | __is_not_equal | 
| Opérateurs binaires | Méthodes | 
| | (OR binaire) | __bw_or | 
| & (AND binaire) | __bw_and | 
| ^ (XOR binaire) | __bw_xor | 
| ~ (NOT binaire) | __bw_not | 
| << (décalage à gauche) | __sl | 
| >> (décalage à droite) | __sr | 
| Opérateurs d'assignation | Méthodes | 
| = (assignation) | __assign | 
| += | __assign_add | 
| -= | __assign_sub | 
| /= | __assign_div | 
| *= | __assign_mul | 
| %= | __assign_mod | 
| <<= | __assign_sl | 
| >>= | __assign_sr | 
| .= | __assign_concat | 
| |= | __assign_bw_or | 
| &= | __assign_bw_and | 
| ^= | __assign_bw_xor | 
Fonctions anonymes
Attention, il semble que la version actuelle de l'extension operator (0.4.1) produise un crash lorsqu'on utilise une fonction anonyme (closure) :
$f = function(){
};
 
 
      




