WEB-d Développement Web

PHP, SQL, HTML5, CSS3, Javascript, Mootools, Référencement, SEO, CMS, e-commerce, Apache, Linux, Ubuntu, ...

Surcharge d'opérateurs PHP (operator overloading)

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

Voir la fiche du bug

Articles similaires