{"id":229692,"date":"2022-11-08T12:48:00","date_gmt":"2022-11-08T09:48:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229692"},"modified":"2022-11-09T15:57:57","modified_gmt":"2022-11-09T12:57:57","slug":"evitando-class_exists-no-codigo-wordpress-orientado-a-objetos","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/evitando-class_exists-no-codigo-wordpress-orientado-a-objetos\/","title":{"rendered":"Evitando class_exists no c\u00f3digo WordPress orientado a objetos"},"content":{"rendered":"\n<p>Se voc\u00ea escrever c\u00f3digo orientado a objetos para WordPress (geralmente dentro do contexto de plugins), provavelmente encontrar\u00e1 uma verifica\u00e7\u00e3o class_exists antes de inicializar uma classe. Mas devemos come\u00e7ar a evitar class_exists em grande parte do nosso c\u00f3digo neste ponto (com algumas exce\u00e7\u00f5es que descreverei abaixo).<\/p>\n<p>Dependendo da vers\u00e3o do PHP que voc\u00ea est\u00e1 usando, isso faz sentido. Ou foi uma vez. A partir do PHP 5.3.0, isso n\u00e3o \u00e9 necess\u00e1rio. Em vez disso, \u00e9 uma pr\u00e1tica melhor usar namespaces.<\/p>\n<h2>Evitando class_exists<\/h2>\n<p>Voc\u00ea pode ver todos os requisitos para v\u00e1rias vers\u00f5es do WordPress <a href=\"https:\/\/codex.wordpress.org\/Template:Server_requirements\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nesta p\u00e1gina,<\/a> portanto, se voc\u00ea estiver trabalhando com vers\u00f5es legadas do WordPress, toda a verifica\u00e7\u00e3o class_exists pode valer a pena.<\/p>\n<p>Ainda assim, <a href=\"https:\/\/wordpress.org\/about\/requirements\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e1 uma observa\u00e7\u00e3o importante<\/a> :<\/p>\n<blockquote>\n<p>Nota: Se voc\u00ea estiver em um ambiente legado onde voc\u00ea tem apenas vers\u00f5es mais antigas do PHP ou MySQL, o WordPress tamb\u00e9m funciona com PHP 5.2.4+ e MySQL 5.0+, mas essas vers\u00f5es atingiram o fim da vida \u00fatil oficial e, como tal, <strong>podem expor seu site a vulnerabilidades de seguran\u00e7a<\/strong>.<\/p>\n<\/blockquote>\n<p>Mas para a maioria de n\u00f3s, ambientes de hospedagem modernos suportam pelo menos PHP 5.3.0, se n\u00e3o superior, e por causa disso, n\u00e3o precisamos usar class_exists.<\/p>\n<p>Dito isto, n\u00e3o \u00e9 incomum ver algo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/445ea17547797672a2b8bdfc4fd607da#file-00-class-exists-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a> :<\/p>\n<pre><code>&lt;?php\n\nif (! class_exists( 'My_Unique_Class')) {\n class My_Unique_Class {\n   \/\/ class implementation\n }\n}\n<\/code><\/pre>\n<p>Ou <a href=\"https:\/\/gist.github.com\/tommcfarlin\/445ea17547797672a2b8bdfc4fd607da#file-01-class-exists-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a> :<\/p>\n<pre><code>&lt;?php\n\nif (class_exists( 'My_Unique_Class')) {\n  return;\n}\n\nclass My_Unique_Class {\n   \/\/ class implementation\n}\n<\/code><\/pre>\n<p>Anos atr\u00e1s, eu escreveria c\u00f3digo assim tamb\u00e9m. \u00c0s vezes era para interagir com uma base de c\u00f3digo pr\u00e9-existente. Outras vezes, era porque eu n\u00e3o conhecia nada melhor. O problema \u00e9 que isso se tornou algo que vemos no c\u00f3digo baseado no WordPress quando n\u00e3o precisamos us\u00e1-lo.<\/p>\n<p>Na verdade, eu diria que n\u00e3o dever\u00edamos mais us\u00e1-lo.<\/p>\n<p>Mas quanto mais c\u00f3digo voc\u00ea escreve e quanto mais c\u00f3digo voc\u00ea l\u00ea, mais voc\u00ea aprende, certo? Isso \u00e9 parte de todo o motivo dos namespaces e do carregamento autom\u00e1tico.<\/p>\n<\/p>\n<p>Ent\u00e3o, como o c\u00f3digo acima seria escrito?<\/p>\n<p>Talvez <a href=\"https:\/\/gist.github.com\/tommcfarlin\/445ea17547797672a2b8bdfc4fd607da#file-02-namespace-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace TomMcFarlin;\n\nclass My_Unique_Class {\n  \/\/ class implementation\n}\n<\/code><\/pre>\n<p>Ainda assim, isso levanta a quest\u00e3o para alguns: como os namespaces ajudam no lugar do uso de class_exists?<\/p>\n<p>Idealmente, se a mesma classe existir em um namespace, h\u00e1 um problema com o namespace. Lembre-se de que <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/namespaces-e-carregamento-automatico-no-wordpress\/\" title=\"voc\u00ea pode pensar em um namespace\">voc\u00ea pode pensar em um namespace<\/a> como um pacote composto de pe\u00e7as \u00fanicas. E por serem \u00fanicas, nunca deveria haver outra pe\u00e7a ou, nesta classe, outra classe igual.<\/p>\n<p>Para esse fim, em vez de usar verifica\u00e7\u00f5es class_exists, tente usar namespaces. Claro, n\u00e3o estou dizendo para voltar atr\u00e1s e refatorar todo o seu c\u00f3digo \u2013 eu n\u00e3o fiz isso \u2013 mas isso n\u00e3o significa que o c\u00f3digo que escrevo ou reviso inclua o uso ou recomenda\u00e7\u00f5es.<\/p>\n<p>\u00c9 uma mudan\u00e7a f\u00e1cil que pode ajudar bastante a manter o c\u00f3digo mais f\u00e1cil de ler, cheio de menos condicionais (um post para outra hora) e mant\u00ea-lo muito mais organizado.<\/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>Devemos come\u00e7ar a evitar class_exists em grande parte do nosso c\u00f3digo neste ponto (com algumas exce\u00e7\u00f5es que descreverei mais tarde).<\/p>\n","protected":false},"author":1,"featured_media":166297,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[722,846,867],"tags":[1170],"class_list":["post-229692","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvedor","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229692","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=229692"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229692\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/166297"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229692"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229692"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}