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(){
};


