Die Antwort von @null ist richtig - der einfachste Weg, dies zu tun, ist mit isset
if (isset($A->b->c)) { /* c exists */ }
Die Gründe dafür sind jedoch nicht offensichtlich (zumindest für mich), und es gibt eine ganze Reihe von Fehlinformationen auf dieser Seite. Es hat eine Weile gedauert, bis ich es richtig verstanden habe, deshalb wollte ich meine Erkenntnisse weitergeben.
Wie bereits erwähnt, erhalten Sie beim Zugriff auf ein nicht vorhandenes untergeordnetes Element eines SimpleXMLElements eigentlich ein "leeres" SimpleXMLElement, im Gegensatz zu false oder null.
Wenn b also zum Beispiel nicht existiert:
$b = $A->b; // $b is now an empty SimpleXMLElement
$b->getName(); // returns an empty string
isset($b); // returns true
Sie könnten also denken, dass die Verwendung von isset
auf das Vorhandensein von Kindern zu testen, wird nicht funktionieren, denn wenn das Kind nicht existiert, erhalten wir immer noch ein leeres SimpleXMLObject, also isset
wird zwangsläufig true zurückgeben.
Tatsächlich ist das aber nicht der Fall:
isset($A->b); // returns false
Das war für mich ziemlich überraschend! Der Grund dafür ist, dass isset
ist keine reguläre Funktion, sondern ein PHP-Sprachkonstrukt. Wenn Sie die Funktion isset($A->b)
PHP berechnet nicht zuerst $A->b
und übergeben dann das Ergebnis als Argument an isset()
. Stattdessen ist das Verhalten, wenn isset bei einer unzugänglichen Objekteigenschaft aufgerufen wird, der Aufruf der __isset()
Überladungsmethode für die Klasse (wie hier erklärt: https://www.php.net/manual/en/language.oop5.overloading.php#object.isset )
So kann der Autor der Klasse das Ergebnis von isset($A->b)
unabhängig vom Ergebnis der $b = $A->b
. Im Fall von SimpleXMLElement haben sie es so eingerichtet, dass isset($A->b)
gibt true zurück, wenn b existiert, und false, wenn nicht - genau das, was wir brauchen, um die Existenz eines untergeordneten Elements zu prüfen.
Eine weitere Fußnote dazu - die ursprüngliche Frage bezog sich auf die Prüfung der Existenz von $A->b->c
. Verwendung von isset($A->b->c)
funktioniert auch in diesem Fall perfekt, selbst wenn das Zwischenprodukt b nicht existiert. Ich denke, was hier passiert ist, dass PHP zuerst $A->b
und wenn b nicht existiert, erhält es ein leeres SimpleXMLElement, dann ruft es __isset('c')
auf dieses leere SimpleXMLElement, um das Endergebnis von isset($A->b->c)
.
1 Stimmen
Bitte wählen Sie eine neue Antwort