Poo Comparaison d'objets

PHP cours tutorial

Comparaison d'objets

En PHP, la comparaison d'objets est proche du comportement des langages orientée objet.

Lors de l'utilisation de l'opérateur de comparaison ==, les objets sont comparés de manière simple, à savoir :

deux objets sont égaux s'ils ont les mêmes attributs et valeurs, et qu'ils sont des instances de la même classe.

Mais, lors de l'utilisation de l'opérateur d'identité (===), les objets sont identiques uniquement s'ils font référence à la même instance de la même classe.

Des  exemples por illustrer ces règles.

Exemple 1 : Dans l’exemple suivant nous supposons que nous avons deux objets à comparer $objet1 et $objet2.

Et nous allons faire comme nous avons toujours fait en comparant des chaînes de caractères ou des nombres. Voici ce que ça donne :

Sélectionner le code

  <?php
      if ($objet1 == $objet2)
          echo '$objet1 et $objet2 sont identiques ';
      else
          echo '$objet1 et $objet2 sont différents ';
  ?>

 

Pour que la condition renvoie true et notre script affiche « $objet1 et $objet2 sont identiques », il faut que $objet1 et $objet2 aient les mêmes attributs et les mêmes valeurs, mais également que les deux objets soient des instances de la même classe.

 Et donc  même s'ils ont les mêmes attributs et valeurs mais que l'un est une instance de une classe A et l'autre une instance de une classe B, la condition renverra false et notre script va donc afficher «$objet1 et $objet2 sont différents ».

Un autre exemple avec 3 objets : $a et $c des  instances d’une classe A et $b instance d’une classe B . nos 3 objets ont les mêmes attributs et valeurs.

Comme suit

Sélectionner le code

<?php
    class A
    {
        public $attribut1;
        public $attribut2;
    }
   
    class B
    {
        public $attribut1;
        public $attribut2;
    }
   
    $a = new A;
    $a->attribut1 = 'Hello';
    $a->attribut2 = 'Salut';
   
    $b = new B;
    $b->attribut1 = 'Hello';
    $b->attribut2 = 'Salut';
   
    $c = new A;
    $c->attribut1 = 'Hello';
    $c->attribut2 = 'Salut';
   
    if ($a == $b)
        echo '$a et $b sont identiques';
    else
        echo '$a et $b sont différents';
   
    echo '<br />';
   
    if ($a == $c)
        echo '$a et $c sont identiques';
    else
        echo '$a et $c sont différents  ';
?>

 

Ce qui affiche :

$a et $b sont différents
$a et $c sont identiques

Les objets $a et $b ont beau avoir les mêmes attributs et les mêmes valeurs, mais ils  sont différents car ils ne sont pas des instances de la même classe.

Alor que $a et $c sont bien identiques.

Mais que se passe-t-il avec  l'opérateur === qui permet de vérifier que deux objets sont strictement identiques ?

Note :

Vous ne connaissez pas cet opérateur ?

Et bien sachez que :

L'opérateur égal (==) compare les deux valeurs qu'on lui demande sans se soucier de leur type. Si vous décidez de comparer une chaîne de caractères et un entier, alors la chaîne de caractères sera convertie en entier.

Alors qu’une condition avec l’opérateur strictement identique (===)  renvoie true si  les deux valeurs sont les mêmes et s'il sont  du même type.

Pour l'opérateur strictement différent (!==) son fonctionnement est le même que l'opérateur strictement identique, une condition avec cet opérateur renvoie true si

l'une des deux valeurs n'est pas la même ou si les deux valeurs ne sont pas du même type.

Retournons à notre comparaison avec cet exemple.

Exemple :

Sélectionner le code

  <pre>
  <?php
  function bool2str($bool)
  {
      if ($bool === false) {
              return 'Faut ';
      } else {
              return 'Vrai';
      }
  }
  function compareObjects(&$objet1, &$objet2)
  {
      echo 'objet1 == objet2 : '.bool2str($objet1 == $objet2)."\n";
      echo 'objet1 != objet2 : '.bool2str($objet1 != $objet2)."\n";
      echo 'objet1 === objet2 : '.bool2str($objet1 === $objet2)."\n";
      echo 'objet1 !== objet2 : '.bool2str($objet1 !== $objet2)."\n";
  }
  class Flag
  {
      public $flag;
      function Flag($flag = true) {
              $this->flag = $flag;
      }
  }
  class OtherFlag
  {
      public $flag;
      function OtherFlag($flag = true) {
              $this->flag = $flag;
      }
  }
  $o = new Flag();
  $p = new Flag();
  $q = $o;
  $r = new OtherFlag();
  echo "Deux instances de la même classe\n";
  compareObjects($o, $p);
  echo "\nDeux références sur le même objet\n";
  compareObjects($o, $q);
  echo "\nInstances de classes différentes\n";
  compareObjects($o, $r);
  ?>
  </pre>

 

Ce qui affiche :

Deux instances de la même classe
objet1 == objet2 : Vrai
objet1 != objet2 : Faut
objet1 === objet2 : Faut
objet1 !== objet2 : Vrai

Deux références sur le même objet
objet1 == objet2 : Vrai
objet1 != objet2 : Faut
objet1 === objet2 : Vrai
objet1 !== objet2 : Faut

Instances de classes différentes
objet1 == objet2 : Faut
objet1 != objet2 : Vrai
objet1 === objet2 : Faut
objet1 !== objet2 : Vrai

Par carabde 20 Aout 2014