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_tablede 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_tableau 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_rchange 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_tableetpropertiessont 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_rrend 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