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