In den letzten Jahren hat JSON als König der Datenwechselformate übernommen. Vor JSON regierte XML den Schlaf. Es war großartig darin, komplexe Daten zu modellieren, aber es ist schwierig zu analysieren und ist sehr ausführlich. JSON startete wirklich mit der Verbreitung reicher Ajax -gesteuerter Websites, da es sich um ein sehr menschlich lesbares Format handelt, das schnell analysiert und seine einfache Schlüssel-/Wertdarstellung die gesamte Ausführlichkeit von XML abnimmt.
Ich denke, wir könnten uns alle einig sein, dass das Schreiben weniger Code, das wiederum weniger Wartung erfordert und weniger Fehler einführt, ein Ziel ist, das wir alle erreichen möchten. In diesem Beitrag möchte ich Ihnen eine wenig bekannte Schnittstelle vorstellen, die in PHP 5.4.0 als JsonSerializable eingeführt wurde.
Bevor die JsonSerializable -Schnittstelle verfügbar war, bedeutete die Rückgabe einer JSON -codierten Darstellung eines Objekts für einen konsumierenden Dienst eines von zwei Dingen.
Wir haben hier ein Array verwendet, um die Daten aus dem Kundenobjekt zu halten, das wir codieren wollten, aber es könnte genauso leicht eine STD -Klasse gewesen sein.
<span><span><?php </span></span><span> </span><span><span>class Customer </span></span><span><span>{ </span></span><span> </span><span> <span>private $email = null; </span></span><span> <span>private $name = null; </span></span><span> </span><span> <span>public function __construct($email, $name) </span></span><span> <span>{ </span></span><span> <span>$this->email = $email; </span></span><span> <span>$this->name = $name; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getName() </span></span><span> <span>{ </span></span><span> <span>return $this->name; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getEmail() </span></span><span> <span>{ </span></span><span> <span>return $this->email; </span></span><span> <span>} </span></span><span><span>} </span></span><span> </span><span><span>$customer = new Customer('customer@sitepoint.com', 'Joe'); </span></span><span> </span><span><span>$data = [ </span></span><span> <span>'customer' => [ </span></span><span> <span>'email' => $customer->getEmail(), </span></span><span> <span>'name' => $customer->getName() </span></span><span> <span>] </span></span><span><span>]; </span></span><span> </span><span><span>echo json_encode($data);</span></span>
Dieser Ansatz war flexibel und diente in sehr einfachen Situationen, in denen wir wussten, dass sich das Kundenobjekt nicht ändern würde, und wir würden nur in diesem Format Kundendaten benötigen. Wir hatten auch die Möglichkeit, dieses Array aus anderen Quellen Daten zu diesem Array hinzuzufügen, wenn wir mussten.
Wie wir jedoch alle zu der einen oder anderen Zeit erlebt haben, können die Annahmen, die wir getroffen haben, zu einem Moment erwiesen werden. Wir können eine Anforderung erhalten, die uns auffordert, der Kundenklasse weitere Daten hinzuzufügen. Diese neuen Daten müssen in den Verbrauchsdienst zurückgegeben werden, und wir möchten dies an zahlreichen Stellen.
Wie Sie sich vorstellen können, wird dieser Ansatz schnell problematisch. Wir müssen diesen Array -Code nicht nur in unserer Anwendung duplizieren, wir müssen uns auch daran erinnern, alle diese Fälle zu aktualisieren, wenn weitere Änderungen zwangsläufig eingehen. Es gibt jedoch einen anderen Weg, das uns dabei hilft, einige dieser Probleme aufzuheben.
Zum Glück waren wir schlau, als die erste Änderungsanfrage eintrat und wir stellten fest, dass die Duplikation unseres Arrays ein Albtraum sein würde. Wir beschlossen also, diese Codierungsfunktionen in unserem Objekt zu verinnerlichen, die Wartungsprobleme zu entfernen und die Verringerung des Wahrscheinlichkeit, Fehler einzuführen.
<span><span><?php </span></span><span> </span><span><span>class Customer </span></span><span><span>{ </span></span><span> </span><span> <span>private $email = null; </span></span><span> <span>private $name = null; </span></span><span> </span><span> <span>public function __construct($email, $name) </span></span><span> <span>{ </span></span><span> <span>$this->email = $email; </span></span><span> <span>$this->name = $name; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getName() </span></span><span> <span>{ </span></span><span> <span>return $this->name; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getEmail() </span></span><span> <span>{ </span></span><span> <span>return $this->email; </span></span><span> <span>} </span></span><span><span>} </span></span><span> </span><span><span>$customer = new Customer('customer@sitepoint.com', 'Joe'); </span></span><span> </span><span><span>$data = [ </span></span><span> <span>'customer' => [ </span></span><span> <span>'email' => $customer->getEmail(), </span></span><span> <span>'name' => $customer->getName() </span></span><span> <span>] </span></span><span><span>]; </span></span><span> </span><span><span>echo json_encode($data);</span></span>
Wenn jetzt weitere Änderungsanforderungen eingehen, die mehr Daten hinzugefügt und aus dem Kundenobjekt zurückgegeben werden sollen, können wir einfach die Tojson -Methode aktualisieren.
Dieser Ansatz hat jedoch seine eigenen Nachteile. Jeder andere, der auftritt und unseren Kunden nutzen möchte, muss sich dieser Tojson -Methode bewusst sein, da dies nicht leicht überprüft werden kann. Daher benötigen wir eine genaue Dokumentation. Wir müssen uns auch daran erinnern, dass diese Methode jetzt JSON zurückgibt (obwohl wir die Serialisierung außerhalb der Methode verschieben können). Dies macht die Kombination von Kundendaten mit anderen Datenquellen unangenehmer, da wir darauf achten müssen, dass wir das Ergebnis dieser Methode nicht erneut codieren, da dies einige böse Fehler verursachen würde.
Geben Sie schließlich die JsonSerializable -Schnittstelle ein. Dies gibt uns die Flexibilität des hässlichen Szenarios mit den Vorteilen der Wartbarkeit des schlechten Szenarios. Um diese Schnittstelle zu verwenden, müssen Sie jedoch PHP 5.4.0 ausführen, was Sie sowieso tun sollten, da es viele Verbesserungen gegenüber älteren Versionen gibt.
Also, zu Geschäft.
<span><span><?php </span></span><span> </span><span><span>class Customer </span></span><span><span>{ </span></span><span> </span><span> <span>public $email = null; </span></span><span> <span>public $name = null; </span></span><span> </span><span> <span>public function __construct($email, $name) </span></span><span> <span>{ </span></span><span> <span>$this->email = $email; </span></span><span> <span>$this->name = $name; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getName() </span></span><span> <span>{ </span></span><span> <span>return $this->name; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getEmail() </span></span><span> <span>{ </span></span><span> <span>return $this->email; </span></span><span> <span>} </span></span><span> </span><span> <span>public function toJson() </span></span><span> <span>{ </span></span><span> <span>return json_encode([ </span></span><span> <span>'customer' => [ </span></span><span> <span>'email' => $this->getEmail(), </span></span><span> <span>'name' => $this->getName() </span></span><span> <span>] </span></span><span> <span>]); </span></span><span> <span>} </span></span><span><span>} </span></span><span> </span><span><span>$customer = new Customer('customer@sitepoint.com', 'Joe'); </span></span><span> </span><span><span>echo $customer->toJson();</span></span>
Wie Sie sehen können, implementieren wir JsonSerializable, indem wir die Schnittstelle zu unserer Klasse hinzufügen und dann eine jsonserialisierende Methode in den Körper unserer Klasse hinzufügen, um den Schnittstellenvertrag zu erfüllen.
In der JsonSerialize -Methode konstruieren und geben wir ein Array der Objektdaten zurück, wie wir es mit den anderen Beispielen getan haben. Wenn sich noch einmal ändert, können wir diese eine Methode einfach aktualisieren. Sie werden feststellen, dass die JsonSerialize -Methode nur ein Array zurückgibt.
Die Magie kommt, wenn Sie diese Methode auslösen möchten. Alles, was wir jetzt tun müssen, ist JSON COD eine Instanz dieser Klasse, und diese Methode wird automatisch aufgerufen, das Array der Daten wurde zurückgegeben und dann codiert! Nachdem die Klasse eine Schnittstelle implementiert, profitieren wir davon, zu prüfen, ob diese Klasse eine Instanz von JsonSerializable ist. Wenn Sie wollten, können Sie auch Hinweise in Methoden eingeben, um sicherzustellen, dass eine jsonserialisierbare Schnittstelle übergeben wird.
Mit dieser einfachen Implementierung haben wir die Duplikation entfernt, die Wartungsmenge verringert und die Wahrscheinlichkeit, Fehler einzuführen, verringert. Wir haben es auch trivial gemacht, dass eine andere Person, die unseren Code verwendet, um die Fähigkeit des Objekts zu testen, durch Überprüfung zu kodieren, ob es sich um eine Instanz von JsonSerializable handelt.
Die obigen Beispiele sind natürlich erfunden. Ich hoffe jedoch, dass ich es geschafft habe, die Vorteile der Verwendung dieser Schnittstelle zu demonstrieren und Sie dazu zu inspirieren, sie selbst zu verwenden.
Das obige ist der detaillierte Inhalt vonSo verwenden Sie die JsonSerializable -Schnittstelle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!