{"id":231410,"date":"2022-12-20T11:43:00","date_gmt":"2022-12-20T08:43:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231410"},"modified":"2022-12-07T10:10:48","modified_gmt":"2022-12-07T07:10:48","slug":"serializacao-de-classe-do-wordpress-com-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/serializacao-de-classe-do-wordpress-com-php\/","title":{"rendered":"Serializa\u00e7\u00e3o de classe do WordPress com PHP"},"content":{"rendered":"\n<p>Se voc\u00ea est\u00e1 acostumado a trabalhar com modelos (em qualquer funda\u00e7\u00e3o ou estrutura, mas especificamente no WordPress), h\u00e1 uma chance de precisar serializar uma inst\u00e2ncia do modelo em algum momento.<\/p>\n<p>Claro, escrever a classe em um banco de dados usando as fun\u00e7\u00f5es internas do PHP \u00e9 bastante f\u00e1cil; no entanto, \u00e9 importante introduzir um pouco de flexibilidade, especialmente no que se refere \u00e0 disponibiliza\u00e7\u00e3o em outras plataformas.<\/p>\n<p>Por exemplo, digamos que voc\u00ea esteja criando um aplicativo no WordPress que ter\u00e1 algum tipo de informa\u00e7\u00e3o exclusiva representada em um modelo. O modelo ser\u00e1 ent\u00e3o acess\u00edvel por meio de um aplicativo m\u00f3vel por meio <a href=\"https:\/\/developer.wordpress.org\/rest-api\/#why-use-the-wordpress-rest-api\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">da API REST<\/a>.<\/p>\n<p>Indiscutivelmente, uma das maneiras mais f\u00e1ceis de fazer isso \u00e9 usar JSON. \u00c9 um formato que funciona em v\u00e1rios idiomas e plataformas, pode ser facilmente serializado e desserializado por essas plataformas e enviado pela rede conforme necess\u00e1rio.<\/p>\n<p>E \u00e9 incrivelmente f\u00e1cil implementar isso em PHP. Voc\u00ea s\u00f3 precisa garantir que sua classe implemente a interface <a href=\"https:\/\/secure.php.net\/manual\/en\/class.jsonserializable.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">JsonSerializable<\/a>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160816-61e71433d1015.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160816-61e71433d1015.png\" alt=\"Serializa\u00e7\u00e3o de classe do WordPress com PHP\" ><\/a><\/p>\n<p>A partir da documenta\u00e7\u00e3o, a interface faz o seguinte:<\/p>\n<blockquote>\n<p>Objetos que implementam JsonSerializable podem personalizar sua representa\u00e7\u00e3o JSON quando codificados com json_encode().<\/p>\n<\/blockquote>\n<p>O \u00fanico m\u00e9todo que uma classe precisa fornecer \u00e9 <strong>jsonSerialize<\/strong> e, embora seja prov\u00e1vel que voc\u00ea queira serializar todas as propriedades de um objeto (assim como seu estado sempre que for chamado), voc\u00ea pode personalizar a implementa\u00e7\u00e3o da maneira que desejar.<\/p>\n<p>Por exemplo, se voc\u00ea tem uma classe e quer apenas implementar sua propriedade name, ent\u00e3o voc\u00ea implementaria a fun\u00e7\u00e3o <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e87e029f8e28ec9681996761f06d7347#file-00-name-property-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Acme implements JsonSerializable \n{\n  \/**\n   * @var string the name of the model as represented on the front-end.\n   *\/\n  protected $name;\n\n  \/\/ More code here.\n\n  \/**\n   * @return string a JSON representation of this class\n   *\/\n  public function jsonSerialize()\n  {\n      return [\n        'name' =&gt; $this-&gt;getName()\n      ];\n  }\n}<\/code><\/pre>\n<p>Se voc\u00ea quiser adicionar um pouco mais de complexidade, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e87e029f8e28ec9681996761f06d7347#file-01-additional-properties-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fa\u00e7a o seguinte<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Acme implements JsonSerializable \n{\n  \/**\n   * @var string the name of the model as represented on the front-end.\n   *\/\n  protected $name;\n\n  \/**\n   * @var array an array of features about this object.\n   *\/\n  protected $features;\n\n  \/\/ More code here.\n\n  \/**\n   * @return string a JSON representation of this class\n   *\/\n  public function jsonSerialize()\n  {\n      return [\n        'name' =&gt; $this-&gt;getName(),\n        'features' =&gt; [\n          'hair' =&gt; $this-&gt;getHairColor(),\n          'eyes' =&gt; $this-&gt;getEyeColor(),\n         ],\n      ];\n  }\n}<\/code><\/pre>\n<p>E se voc\u00ea quiser se aprofundar na serializa\u00e7\u00e3o das propriedades, poder\u00e1 implementar <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e87e029f8e28ec9681996761f06d7347#file-02-acme-serializable-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">um loop para construir um array<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Acme implements JsonSerializable \n{\n  \/**\n   * @var string the name of the model as represented on the front-end.\n   *\/\n  protected $name;\n\n  \/**\n   * @var array an array of features about this object.\n   *\/\n  protected $features;\n\n  \/\/ More code here.\n\n  \/**\n   * @return string a JSON representation of this class\n   *\/\n  public function jsonSerialize()\n  {\n      $objectArray = [];\n      foreach ($this as $key =&gt; $value) {\n          $objectArray[$key] = $value;\n      }\n\n      return $objectArray;\n  }\n}<\/code><\/pre>\n<p>Seja qual for o caso, quando uma inst\u00e2ncia da classe \u00e9 passada para a\u00a0 fun\u00e7\u00e3o <strong>json_encode<\/strong>, ela invocar\u00e1 a\u00a0 fun\u00e7\u00e3o <strong>jsonSerialize<\/strong> no objeto para que voc\u00ea obtenha a representa\u00e7\u00e3o do objeto no formato JSON conforme projetado.<\/p>\n<p>Isso \u00e9 incrivelmente f\u00e1cil e \u00fatil quando se trata de fornecer dados de uso em v\u00e1rias plataformas (ou at\u00e9 mesmo <a href=\"https:\/\/secure.php.net\/manual\/en\/function.json-decode.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">na mesma plataforma<\/a> ).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Usando a interface JsonSerializable, adicionar serializa\u00e7\u00e3o de classe do WordPress \u00e9 muito f\u00e1cil.<\/p>\n","protected":false},"author":1,"featured_media":236064,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[806],"tags":[1170],"class_list":["post-231410","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=231410"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231410\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236064"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}