Unerwartetes Ergebnis beim Vergleich von PHP-Objekten

Lesezeit: 2 Minuten

Benutzer-Avatar
sergio

Wenn ich zwei verschiedene Objekte vergleiche, kehrt es zuerst zurück trueund dann danach print_r (auf Objekten) zurückgegeben false.

Aus dem PHP-Handbuch:

Zwei Objektinstanzen sind gleich, wenn sie dieselben Attribute und Werte haben und Instanzen derselben Klasse sind.

Aber hier habe ich zum Beispiel andere Werte gesetzt. Warum unterscheidet sich das Ergebnis zwischen 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);

Ergebnis ist:

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

Aber was ich erwartet hatte war:

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

  • Nun, ich bestätige dies. Sehen 3v4l.org/B6qrN – seit 5.4.0 gibt es true/false. Seltsam

    – Jasir

    3. Januar 2014 um 22:56 Uhr

  • Das muss ein Fehler in PHP sein. Ich habe die Deklarationsreihenfolge von Eigenschaften in der zweiten Klasse vertauscht und wir erhalten überall falsch/falsch: 3v4l.org/6VQ14

    – Jasir

    3. Januar 2014 um 23:12 Uhr


  • Tatsächlich scheint das print_r das Verhalten zu beeinflussen – 3v4l.org/Z8l7r

    – Danack

    3. Januar 2014 um 23:31 Uhr

  • Kann mit aktuellem Master nicht mehr reproduziert werden. (auch bekannt als Fehler behoben)

    – bwoebi

    4. Januar 2014 um 0:34 Uhr

  • @Nadir-Sampaoli – abgesehen von Ihrem scherzhaften Kommentar, schauen Sie sich an, wie schnell der Fehler behoben wurde, nachdem er identifiziert wurde

    – Markus Bäcker

    4. Januar 2014 um 11:28 Uhr

Dies war ein Fehler in PHP. Es ist jetzt behoben, siehe die verpflichten. Zusamenfassend:

  • Wenn Sie eine Klasse erweitern und dieselbe Eigenschaft neu definieren, wird die properties_table des Objekts endet mit einem NULL-Wert.
  • Das Vergleichscode fälschlicherweise abgebrochener Vergleich, wenn zwei Objekte einen NULL-Wert in der hatten properties_table am selben Index – die Objekte werden als gleich gemeldet. Das macht natürlich keinen Sinn, weil es alle Unterschiede in den folgenden Eigenschaften verwirft. Das ist jetzt behoben.
  • Der Grund warum print_r das Ergebnis ändert, ist, dass durch Abrufen der Eigenschaften des Objekts (get_properties) die Eigenschaften-Hashtabelle wird neu erstellt (rebuild_properties_table), die einen völlig anderen (und korrekten) Vergleichscode verwendet.
  • Für den Kontext, properties_table und properties Es gibt zwei verschiedene Möglichkeiten, die PHP zur Darstellung von Eigenschaften verwendet – erstere ist viel effizienter und wird für deklarierte Eigenschaften verwendet, und letztere für dynamische Eigenschaften. Das print_r call macht die Objekteigenschaften effektiv dynamisch.

Benutzer-Avatar
Jasir

Gut, ok, Identifiziert als Fehler in PHP https://bugs.php.net/bug.php?id=66286.

Auch hier: Unerwartetes Ergebnis beim Vergleich von PHP-Objekten

1055760cookie-checkUnerwartetes Ergebnis beim Vergleich von PHP-Objekten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy