{"id":230889,"date":"2022-12-07T10:47:00","date_gmt":"2022-12-07T07:47:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230889"},"modified":"2022-11-10T00:27:35","modified_gmt":"2022-11-09T21:27:35","slug":"uma-maneira-facil-de-converter-uma-classe-padrao-php-para-um-tipo-especifico","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/uma-maneira-facil-de-converter-uma-classe-padrao-php-para-um-tipo-especifico\/","title":{"rendered":"Uma maneira f\u00e1cil de converter uma classe padr\u00e3o PHP para um tipo espec\u00edfico"},"content":{"rendered":"\n<p>Se voc\u00ea trabalha com PHP orientado a objetos no WordPress e est\u00e1 construindo v\u00e1rios modelos que se encaixam em seus aplicativos da Web, as chances s\u00e3o de que voc\u00ea vai lidar com a recupera\u00e7\u00e3o de vers\u00f5es serializadas desses modelos em algum momento durante a execu\u00e7\u00e3o de um programa.<\/p>\n<p>Aqui est\u00e1 a coisa, por\u00e9m: \u00c0s vezes, esses dados n\u00e3o serializados voltam como classes PHP padr\u00e3o. Isso significa que, se voc\u00ea inspecionar o tipo (por meio de v\u00e1rias ferramentas de depura\u00e7\u00e3o), ver\u00e1 que eles s\u00e3o do tipo <a href=\"https:\/\/php.net\/manual\/en\/language.types.object.php#language.types.object.casting\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">stdClass<\/a>.<\/p>\n<p>Se voc\u00ea estiver construindo adequadamente seus modelos, seu c\u00f3digo ter\u00e1 fun\u00e7\u00f5es que a <strong>stdClass<\/strong> n\u00e3o possui, e voc\u00ea desejar\u00e1 cham\u00e1-las.<\/p>\n<p>Al\u00e9m disso, voc\u00ea n\u00e3o pode simplesmente convert\u00ea-los de um tipo para outro como voc\u00ea pode fazer com tipos nativos (como strings, inteiros e assim por diante). Em situa\u00e7\u00f5es como essa, voc\u00ea precisa ser capaz de converter uma classe padr\u00e3o do PHP para um tipo espec\u00edfico.<\/p>\n<p>E aqui est\u00e1 uma fun\u00e7\u00e3o que ir\u00e1 ajud\u00e1-lo a fazer exatamente isso.<\/p>\n<h2>Cast um PHP uma classe padr\u00e3o para um tipo espec\u00edfico<\/h2>\n<p>Para este exemplo, suponha o seguinte:<\/p>\n<ol>\n<li>Eu tenho uma classe com namespace como <strong>AcmeModelProduct<\/strong>.<\/li>\n<li>Ele, em algum momento, \u00e9 salvo no banco de dados do WordPress, mas quando recuperado \u00e9 definido como uma inst\u00e2ncia de <strong>stdClass<\/strong>.<\/li>\n<li>Eu preciso que a vers\u00e3o n\u00e3o serializada do objeto seja a do <strong>Product<\/strong>.<\/li>\n<\/ol>\n<p>Para esse fim, tenho a seguinte fun\u00e7\u00e3o dispon\u00edvel que coloco em projetos <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/49aae6f2d029b369b2c4bdb35c7b8107#file-00-cast-class-to-type-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">conforme necess\u00e1rio:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * This function will take an instance of a PHP stdClass and attempt to cast it to\n * the type of the specified $className.\n *\n * For example, we may pass 'AcmeModelProduct' as the $className.\n *\n * @param object $instance  an instance of the stdClass to convert\n * @param string $className the name of the class type to which we want to cals\n *\n * @return mixed a version of the incoming $instance casted as the specified className\n *\/\nprotected function cast($instance, $className)\n{\n    return unserialize(sprintf(\n        'O:%d:\"%s\"%s',\n        strlen($className),\n        $className,\n        strstr(strstr(serialize($instance), '\"'), ':')\n    ));\n}\n<\/code><\/pre>\n<p>Claro, a fun\u00e7\u00e3o \u00e9 comentada com o m\u00e1ximo de detalhes que posso fornecer, mas h\u00e1 algumas coisas que posso explicar um pouco mais no contexto de uma postagem do que no contexto de um coment\u00e1rio de c\u00f3digo.<\/p>\n<h3>Entendendo o C\u00f3digo<\/h3>\n<p>Primeiro, \u00e9 importante garantir que voc\u00ea entenda as seguintes fun\u00e7\u00f5es do PHP (todas elas est\u00e3o bem definidas no manual do PHP):<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.unserialize.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">desserializar<\/a>. Cria um valor PHP de uma representa\u00e7\u00e3o armazenada.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.sprintf.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sprintf<\/a>. Retorna uma string formatada<\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.sprintf.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">forte<\/a><\/strong>. Obter comprimento da string<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.strstr.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">strstr<\/a>. Encontre a primeira ocorr\u00eancia de uma string.<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.serialize.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">serializar<\/a>. Gera uma representa\u00e7\u00e3o armazen\u00e1vel de um valor.<\/li>\n<\/ul>\n<p>Ent\u00e3o, sim, a inst\u00e2ncia de entrada da classe \u00e9 recuperada e depois convertida como o tipo especificado, mas como as fun\u00e7\u00f5es acima desempenham um papel nisso? Tem a ver com como uma classe \u00e9 serializada no banco de dados do WordPress.<\/p>\n<p>Tomemos por exemplo a <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/49aae6f2d029b369b2c4bdb35c7b8107#file-01-serialized-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seguinte string:<\/a><\/strong><\/p>\n<pre><code>O:17:\"AcmeModelProduct\":8:{s:25:\"\ufffdAcmeModelProduct\ufffdnumber\";s:3:\"532\";s:23:\"\ufffdAcmeModelProduct\ufffdname\";s:23:\"Aura Bath &amp; Spa - Matte\";s:27:\"\ufffdAcmeModelProduct\ufffdlongName\";s:56:\"Aura Bath &amp; Spa Waterborne Interior Paint - Matte Finish\";s:22:\"\ufffdAcmeModelProduct\ufffdurl\";s:37:\"http:\/\/www.benjaminmoore.com\/aura_532\";s:27:\"\ufffdAcmeModelProduct\ufffdshortUrl\";s:9:\"\/aura_532\";s:26:\"\ufffdAcmeModelProduct\ufffdimage1x\";s:153:\"www2.benjaminmoore.com\/ShowPropertyServlet?nodePath=\/BEA Repository\/imagerepository\/public_site\/product_images_new\/IA_pri_0532\/\/image_88x86.content_en_US\";s:26:\"\ufffdAcmeModelProduct\ufffdimage2x\";s:155:\"www2.benjaminmoore.com\/ShowPropertyServlet?nodePath=\/BEA Repository\/imagerepository\/public_site\/product_images_new\/IA_pri_0532\/\/image_197x193.content_en_US\";s:26:\"\ufffdAcmeModelProduct\ufffdimage3x\";s:155:\"www2.benjaminmoore.com\/ShowPropertyServlet?nodePath=\/BEA Repository\/imagerepository\/public_site\/product_images_new\/IA_pri_0532\/\/image_197x193.content_en_US\";}<\/code><\/pre>\n<p>Eu sei \u2013 n\u00e3o \u00e9 exatamente um prazer revisar, mas \u00e9 exatamente como o WordPress serializa um objeto. Al\u00e9m disso, quando \u00e9 recuperado do banco de dados, \u00e9 feito e retornado como uma inst\u00e2ncia <strong>stdClass<\/strong>, n\u00e3o como uma inst\u00e2ncia do tipo que era antes de ser salva.<\/p>\n<p>\u00c9 a\u00ed que a fun\u00e7\u00e3o acima entra em jogo. Para restaur\u00e1-lo ao seu tipo de neg\u00f3cio, conv\u00e9m convert\u00ea-lo como tal. E para fazer isso, voc\u00ea pode simplesmente fazer o seguinte:<\/p>\n<pre><code>&lt;?php\n$exampleObject = get_option('acmeModelProject', null);\nif (null === $exampleObject) {\n  return;\n}\n\n$exampleObject = $this-&gt;cast($exampleObject, 'AcmeModelProduct');\n<\/code><\/pre>\n<p>Observe que estou recuperando um objeto que foi serializado na tabela de op\u00e7\u00f5es. Eu n\u00e3o estou argumentando se voc\u00ea deve fazer isso ou n\u00e3o, isso \u00e9 para fins de exemplo.<\/p>\n<p>Em segundo lugar, observe que estou chamando <strong>cast<\/strong> em uma inst\u00e2ncia de <strong>$this<\/strong> para que <strong>$this<\/strong> possa ser uma inst\u00e2ncia de uma classe ou um m\u00e9todo na classe base. N\u00e3o importa (desde que o \u00faltimo esteja marcado como <strong>protegido<\/strong> ).<\/p>\n<p>A partir da\u00ed, agora voc\u00ea tem uma inst\u00e2ncia da classe que voc\u00ea salvou originalmente com todas as informa\u00e7\u00f5es dispon\u00edveis para voc\u00ea como estavam quando voc\u00ea a salvou pela primeira vez.<\/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>Voc\u00ea n\u00e3o pode simplesmente convert\u00ea-los de um tipo para outro como voc\u00ea pode fazer com tipos nativos (como strings, inteiros e assim por diante). Em situa\u00e7\u00f5es como essa, voc\u00ea precisa ser capaz de converter uma classe padr\u00e3o do PHP para um tipo espec\u00edfico.<\/p>\n","protected":false},"author":1,"featured_media":236170,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[806],"tags":[1170],"class_list":["post-230889","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\/230889","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=230889"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230889\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236170"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230889"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230889"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230889"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}