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
etproperties
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'appelprint_r
rend effectivement les propriétés de l'objet dynamique.
26
répondu
NikiC
2014-01-04 00:40:09
Eh bien, ok, identifié comme bug en php https://bugs.php.net/bug.php?id=66286 .
Aussi ici: résultat inattendu lors de la comparaison des objets PHP
4
répondu
jasir
2017-05-23 11:44:07