Résultat inattendu lors de la comparaison des objets PHP

Lorsque j'ai comparé deux objets différents, il retourne tout d'abord true, et qu'après print_r (sur les objets) retourné false.

Du manuel PHP:

Deux instances d'objet sont égales si elles ont les mêmes attributs et valeurs, et sont des instances de la même classe.

Mais ici, dans l'exemple, je mets des valeurs différentes. Pourquoi le résultat est différent entre PHP 5.4.0-5.5.7?

abstract class first
{
    protected $someArray = array();
}     

class second extends first
{    
    protected $someArray = array();        
    protected $someValue = null;

    public function __construct($someValue)
    {
        $this->someValue = $someValue;
    }
}

    $objFirst = new second('123');       
    $objSecond = new second('321');       

    var_dump ($objFirst == $objSecond);    
    print_r($objFirst);    
    var_dump ($objFirst == $objSecond);

Le résultat est:

 bool(true)
 second Object ( [someArray:protected] =>
 Array ( ) [someValue:protected] => 123 )
 bool(false)

Mais ce à quoi je m'attendais était:

  bool(false)
  second Object ( [someArray:protected] =>
  Array ( ) [someValue:protected] => 123 )
  bool(false)
26
demandé sur halfer 2014-01-04 02:19:14

2 réponses

C'était un bug en PHP. C'est corrigé maintenant, voyez le commettre. En bref:

  • Si vous étendez une classe et redéfinissez la même Propriété, properties_table de l'objet finit par avoir une valeur nulle.
  • le code de comparaison a incorrectement abandonné la comparaison lorsque deux objets avaient une valeur nulle dans le properties_table au même index-signalant les objets comme égaux. Cela n'a pas de sens bien sûr, car il élimine toutes les différences dans les propriétés suivantes. C'est corrigé maintenant.
  • la raison pour laquelle print_r change le résultat, est qu'en récupérant les propriétés de l'objet (get_properties), la table de hachage des propriétés est reconstruite (rebuild_properties_table) qui utilise un code de comparaison entièrement différent (et correct).
  • pour le contexte, properties_table et properties sont deux manières différentes D'utiliser PHP pour représenter les propriétés - la première étant beaucoup plus efficace et utilisée pour les propriétés déclarées et la seconde utilisée pour les propriétés dynamiques. L'appel print_r rend effectivement les propriétés de l'objet dynamique.
26
répondu NikiC 2014-01-04 00:40:09
4
répondu jasir 2017-05-23 11:44:07