Serializacja klas WordPress z PHP
Jeśli jesteś przyzwyczajony do pracy z modelami (w dowolnym fundamencie lub frameworku, ale konkretnie WordPress), istnieje szansa, że w pewnym momencie może zajść potrzeba serializacji wystąpienia modelu.
Jasne, napisanie klasy do bazy danych przy użyciu wbudowanych funkcji PHP jest dość łatwe; jednak wprowadzenie odrobiny elastyczności, zwłaszcza w odniesieniu do udostępniania na innych platformach, jest ważne.
Załóżmy na przykład, że tworzysz aplikację na WordPressie, która będzie zawierała pewien rodzaj unikalnych informacji reprezentowanych w modelu. Model będzie wówczas dostępny za pośrednictwem aplikacji mobilnej poprzez REST API.
Prawdopodobnie jednym z najłatwiejszych sposobów, aby to zrobić, jest użycie JSON. Jest to format, który działa w różnych językach i platformach, może być łatwo serializowany i deserializowany przez te platformy i przesyłany przez sieć w razie potrzeby.
Zaimplementowanie tego w PHP jest niezwykle łatwe. Musisz tylko upewnić się, że Twoja klasa implementuje interfejs JsonSerializable.
Z dokumentacji interfejs wykonuje następujące czynności:
Obiekty implementujące JsonSerializable mogą dostosować swoją reprezentację JSON po zakodowaniu za pomocą json_encode().
Jedyną metodą, którą klasa musi zapewnić, jest jsonSerialize i chociaż prawdopodobnie będziesz chciał serializować wszystkie właściwości obiektu (a także jego stan, gdy jest wywoływany), możesz dostosować implementację w dowolny sposób.
Na przykład, jeśli masz klasę i chcesz po prostu zaimplementować jej właściwość name, zaimplementujesz funkcję w ten sposób :
<?php
class Acme implements JsonSerializable
{
/**
* @var string the name of the model as represented on the front-end.
*/
protected $name;
// More code here.
/**
* @return string a JSON representation of this class
*/
public function jsonSerialize()
{
return [
'name' => $this->getName()
];
}
}
Jeśli chcesz dodać do tego trochę więcej złożoności, możesz to zrobić :
<?php
class Acme implements JsonSerializable
{
/**
* @var string the name of the model as represented on the front-end.
*/
protected $name;
/**
* @var array an array of features about this object.
*/
protected $features;
// More code here.
/**
* @return string a JSON representation of this class
*/
public function jsonSerialize()
{
return [
'name' => $this->getName(),
'features' => [
'hair' => $this->getHairColor(),
'eyes' => $this->getEyeColor(),
],
];
}
}
A jeśli chcesz zająć się serializacją właściwości, możesz zaimplementować pętlę, aby zbudować tablicę :
<?php
class Acme implements JsonSerializable
{
/**
* @var string the name of the model as represented on the front-end.
*/
protected $name;
/**
* @var array an array of features about this object.
*/
protected $features;
// More code here.
/**
* @return string a JSON representation of this class
*/
public function jsonSerialize()
{
$objectArray = [];
foreach ($this as $key => $value) {
$objectArray[$key] = $value;
}
return $objectArray;
}
}
Niezależnie od przypadku, gdy wystąpienie klasy zostanie przekazane do funkcji json_encode, wywoła ona funkcję jsonSerialize na obiekcie, aby uzyskać reprezentację obiektu w zaprojektowanym formacie JSON.
Jest to niezwykle łatwe i pomocne, jeśli chodzi o udostępnianie danych na wielu platformach (lub nawet na tej samej platformie ).
