[PHP] Objekte vergleichen + eval
Verfasst: 13.03.2007 03:46
Hallo,
ich glaube ich habe einen Fehler in PHP gefunden, und zwar beim Vergleich von 2 Objekten mit === über eine Methode die den Vergleich mithilfe eval ausführt, und eine static Methode einer Klasse nutzt (und nur dann)
egal was für objekte (solange es irgendeine Instanz oder Ableitung ist) dann verglichen werden - angeblich sind alle gleich
Hinweis: nur mit dem aktuellem Xampp 1.6 (PHP 5.2.1) getestet
also
2 objekte werden so erstellt
also müssen alle vergleiche mit === fehlschlagen, egal welche der 3 miteinander verglichen werden
das stimmt aber nur in folgenden 4 Fällen (es soll Fehler angezeigt werden)
die Methode über die ich das Assert ausführe schaut ungefähr so aus:
nun zu der fehlerhaften Zeile:
doIt('Assert::equals($o1, $o2);');
es wird kein Fehler mehr angezeigt, jedoch bei Werten wie 3 und 3 oder string und string
Sorry für die ganzen Code Schnipsel... insgesamt erstreckt sich das über einige Dateien und ich hoffe alles gefunden zu haben, wenn nicht kann ich die beteiligten Dateien ungekürzt per email zuschicken
Liebe Grüße
Emma
ich glaube ich habe einen Fehler in PHP gefunden, und zwar beim Vergleich von 2 Objekten mit === über eine Methode die den Vergleich mithilfe eval ausführt, und eine static Methode einer Klasse nutzt (und nur dann)
egal was für objekte (solange es irgendeine Instanz oder Ableitung ist) dann verglichen werden - angeblich sind alle gleich
Hinweis: nur mit dem aktuellem Xampp 1.6 (PHP 5.2.1) getestet
also
2 objekte werden so erstellt
Code: Alles auswählen
$o1 = new obj('1');
$o2 = new obj('2');
$o3 = new objExt('3'); // abgeleitet von obj
das stimmt aber nur in folgenden 4 Fällen (es soll Fehler angezeigt werden)
- if (o1 === $o2) echo 'fehler';
- eval('if (o1 === $o2) echo 'fehler';');
- Assert::equals($o1, $o2);
- eval('Assert::equals($o1, $o2);');
Code: Alles auswählen
public static function equals($expected, $actual, $message = '') {
if (gettype($expected) == gettype($actual)) {
if ($expected === $actual) {
echo 'fehler';
}
}
}
Code: Alles auswählen
function doIt($eval) {
eval($eval);
}
doIt('Assert::equals($o1, $o2);');
es wird kein Fehler mehr angezeigt, jedoch bei Werten wie 3 und 3 oder string und string
Sorry für die ganzen Code Schnipsel... insgesamt erstreckt sich das über einige Dateien und ich hoffe alles gefunden zu haben, wenn nicht kann ich die beteiligten Dateien ungekürzt per email zuschicken
Liebe Grüße
Emma