{"id":229317,"date":"2022-10-29T09:09:00","date_gmt":"2022-10-29T06:09:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229317"},"modified":"2022-11-09T06:27:34","modified_gmt":"2022-11-09T03:27:34","slug":"namespaces-e-carregamento-automatico-no-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/namespaces-e-carregamento-automatico-no-wordpress\/","title":{"rendered":"Namespaces e carregamento autom\u00e1tico no WordPress"},"content":{"rendered":"\n<p>Na semana passada, fiz minha apresenta\u00e7\u00e3o no <a href=\"https:\/\/2017.atlanta.wordcamp.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordCamp Atlanta<\/a> sobre Namespaces e Autoloading. (o t\u00edtulo completo era Namespaces, Autoloading, and Improving Plugin Architecture, mas isso \u00e9 um bocado, n\u00e3o \u00e9?)<\/p>\n<p>Devido \u00e0 natureza da palestra, optei por escrever uma postagem para acompanhar a postagem, compartilhar os slides e compartilhar um exemplo de plug-in GitHub para ajudar a apoiar a palestra.<\/p>\n<p>Ent\u00e3o se voc\u00ea esteve presente, obrigado(!) e aqui est\u00e1 o post, prometi. E para aqueles que n\u00e3o compareceram, espero que este post ainda ajude a demonstrar os conceitos e t\u00f3picos <a href=\"https:\/\/tommcfarlin.com\/wordcamp-atlanta-2017\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">que discuti no WordCamp<\/a>.<\/p>\n<h2>Namespaces e carregamento autom\u00e1tico<\/h2>\n<p>Antes de falar sobre namespaces e carregamento autom\u00e1tico no WordPress, a raz\u00e3o pela qual quero falar sobre isso \u00e9 porque isso pode afetar diretamente a qualidade do seu c\u00f3digo e pode faz\u00ea-lo por meses e anos.<\/p>\n<p>Afinal, muitos de n\u00f3s desenvolvedores j\u00e1 n\u00e3o fazem a pergunta:<\/p>\n<blockquote>\n<p>Como podemos tornar nosso c\u00f3digo melhor do que j\u00e1 \u00e9?<\/p>\n<\/blockquote>\n<p>E muitos de n\u00f3s s\u00e3o inteligentes o suficiente para saber o que n\u00e3o sabemos. Portanto, temos que trabalhar dentro das restri\u00e7\u00f5es que nos s\u00e3o dadas.<\/p>\n<p>\u00c0s vezes temos tempo para investigar maneiras de fazer isso; outras vezes, trabalhamos com o conhecimento que temos. E n\u00e3o h\u00e1 nada de errado com isso.<\/p>\n<p>Mas porque sabemos o que n\u00e3o sabemos, sabemos que h\u00e1 potencial para mais.<\/p>\n<h3>Primeiro, seu c\u00f3digo<\/h3>\n<p>Quando se trata de falar sobre t\u00f3picos como namespaces e carregamento autom\u00e1tico no contexto do WordPress, acho que muitas vezes recebemos respostas mistas.<\/p>\n<p>Afinal, poder\u00edamos estar falando sobre coisas como <a href=\"https:\/\/codex.wordpress.org\/Theme_Customization_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o Theme Customizer<\/a> ou a <a href=\"https:\/\/developer.wordpress.org\/rest-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API REST<\/a> ou algo mais divertido.<\/p>\n<p>Quero dizer, &quot;namespaces e autoloading&quot; simplesmente n\u00e3o soam empolgantes ou avan\u00e7ados quando comparados aos recursos e tecnologias mais recentes dispon\u00edveis, certo?<\/p>\n<p>Mas n\u00e3o, eles n\u00e3o s\u00e3o realmente chatos. E atrav\u00e9s deste post e da apresenta\u00e7\u00e3o que o acompanha e do c\u00f3digo-fonte, vou mostrar por que e como eles n\u00e3o s\u00e3o.<\/p>\n<h4>Eles n\u00e3o s\u00e3o chatos<\/h4>\n<p>Acho justo dizer que os desenvolvedores \u2013 pelo menos uma parte de n\u00f3s ou uma parte deles dependendo de como voc\u00ea se v\u00ea \u2013 s\u00e3o not\u00f3rios por discutir sobre aspectos da programa\u00e7\u00e3o.<\/p>\n<p>&#8220;Conversa chata de qualquer maneira.&quot;<\/p>\n<p>Na verdade, n\u00e3o \u00e9 incomum ouvir algu\u00e9m discutindo sobre a melhor maneira de inicializar e escrever um loop for com o melhor desempenho poss\u00edvel ao iterar em um pequeno conjunto de banco de dados, apesar do fato de termos processadores quad-core e 16 GB de RAM em nossas m\u00e1quinas desktop.<\/p>\n<p>Ent\u00e3o, se nos importamos tanto com algo t\u00e3o pequeno, certamente nos importamos com o quadro maior. Coisas como:<\/p>\n<ul>\n<li>C\u00f3digo aprimorado<\/li>\n<li>Melhor organiza\u00e7\u00e3o<\/li>\n<li>Maior capacidade de manuten\u00e7\u00e3o<\/li>\n<li>Depura\u00e7\u00e3o mais f\u00e1cil<\/li>\n<li>Ganhar mais dinheiro (bem, talvez).<\/li>\n<\/ul>\n<p>E namespaces e carregamento autom\u00e1tico podem levar diretamente a todos os itens acima (bem, n\u00e3o posso falar sobre dinheiro, mas tem potencial).<\/p>\n<p>Se eu fosse resumir os namespaces de fun\u00e7\u00e3o e o local de carregamento autom\u00e1tico em todos os itens acima, diria que:<\/p>\n<p>Namespaces e carregamento autom\u00e1tico levam a c\u00f3digo aprimorado por meio de melhor organiza\u00e7\u00e3o, compartimenta\u00e7\u00e3o ou modulariza\u00e7\u00e3o e relacionamento mais estreito por meio de seus conceitos.<\/p>\n<p>Al\u00e9m disso, isso aumenta a capacidade de manuten\u00e7\u00e3o porque o c\u00f3digo \u00e9 organizado em pacotes que podem facilitar a depura\u00e7\u00e3o \u00e0 medida que o produto cresce.<\/p>\n<p>Tudo isso pode gerar economia de tempo ou melhor aproveitamento do tempo, o que, dependendo do seu modelo de neg\u00f3cio, pode impactar no resultado final.<\/p>\n<p>Mas isso ainda n\u00e3o descreve nenhuma dessas coisas. Mas certamente, neste ponto, eles soam mais interessantes do que quando foram introduzidos pela primeira vez.<\/p>\n<h4>Ent\u00e3o, o que eles s\u00e3o?<\/h4>\n<p>Antes de entrar nas defini\u00e7\u00f5es de cada um e os pap\u00e9is que eles desempenham, vamos dar uma olhada em como a falta de namespaces e carregamento autom\u00e1tico no WordPress impactou negativamente sua experi\u00eancia ao usar temas, plugins, complementos ou qualquer outra coisa que voc\u00ea tenha.<\/p>\n<p>Ent\u00e3o vamos voltar por um momento e olhar para cada um individualmente.<\/p>\n<h5>Namespaces<\/h5>\n<p>Imagine que voc\u00ea herdou um projeto e est\u00e1 prestes a come\u00e7ar a trabalhar nele. Digamos que seja um plugin do WordPress.<\/p>\n<p>Voc\u00ea o instala; voc\u00ea vai ativ\u00e1-lo e ent\u00e3o voc\u00ea recebe pelo menos um destes:<\/p>\n<ul>\n<li>Talvez voc\u00ea veja aquela mensagem desagrad\u00e1vel de organiza\u00e7\u00e3o na parte superior da janela do navegador exibindo um rastreamento de pilha.<\/li>\n<li>Talvez voc\u00ea veja uma mensagem falando sobre algum conflito com outro pacote existente.<\/li>\n<li>Ou talvez quando voc\u00ea tenta ativar um plug-in, a p\u00e1gina \u00e9 atualizada, mas o plug-in n\u00e3o \u00e9 ativado.<\/li>\n<li>Talvez voc\u00ea tenha feito uma auditoria de c\u00f3digo e veja as verifica\u00e7\u00f5es de class_exists em toda a base de c\u00f3digo.<\/li>\n<\/ul>\n<p>Qualquer um ou todos os itens acima podem contribuir para problemas, \u00e9 claro, com projetos do WordPress. Mas os namespaces podem realmente corrigir muito disso na maioria das vezes.<\/p>\n<p>Ou seja, a raz\u00e3o pela qual voc\u00ea est\u00e1 enfrentando esses problemas \u00e9 que o c\u00f3digo com o qual voc\u00ea est\u00e1 trabalhando faz parte do namespace global (versus seu namespace) e o PHP n\u00e3o gosta quando h\u00e1 classes e m\u00f3dulos com o mesmo nome .<\/p>\n<p>Mas quando voc\u00ea nomeia algo, voc\u00ea d\u00e1 a ele sua \u00e1rea relativa a si mesmo que ainda funcionar\u00e1 bem com outros componentes, mesmo que eles tenham o mesmo nome de classe.<\/p>\n<h5>Carregadores autom\u00e1ticos<\/h5>\n<p>No que diz respeito aos carregadores autom\u00e1ticos, eles s\u00e3o um pouco menos complicados em alguns aspectos. Primeiro, pense no c\u00f3digo que voc\u00ea escreve ou no c\u00f3digo com o qual trabalha \u2013 especialmente no contexto dos plugins do WordPress \u2013 e depois pense em quantas vezes voc\u00ea escreve ou v\u00ea o seguinte:<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.include.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">incluir<\/a><\/li>\n<li>incluir_uma vez<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.require.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">exigir<\/a><\/li>\n<li>requer uma vez<\/li>\n<\/ul>\n<p>E \u00e0s vezes voc\u00ea os v\u00ea no topo do arquivo que inicia o plugin, e \u00e0s vezes voc\u00ea os v\u00ea espalhados por toda a base de c\u00f3digo.<\/p>\n<p>Se eles estiverem todos contidos em um \u00fanico arquivo, isso n\u00e3o \u00e9 t\u00e3o ruim, porque pelo menos voc\u00ea sabe onde eles est\u00e3o. Mas se eles est\u00e3o espalhados por todo o lugar, voc\u00ea n\u00e3o tem ideia de onde uma depend\u00eancia est\u00e1 sendo trazida para o sistema.<\/p>\n<p>O carregamento autom\u00e1tico pode resolver tudo isso carregando as depend\u00eancias quando necess\u00e1rio (e para quem estiver interessado, o carregamento autom\u00e1tico \u00e9 mais r\u00e1pido que a inclus\u00e3o manual).<\/p>\n<h2>Namespaces<\/h2>\n<p>Com tudo isso dito, estamos prontos para falar sobre <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">namespaces<\/a> e carregamento autom\u00e1tico. Mas os namespaces s\u00e3o o conceito fundamental, ent\u00e3o vamos come\u00e7ar por a\u00ed.<\/p>\n<p>Mas depois de todos os itens acima, voc\u00ea pode ver as vantagens de us\u00e1-los. Talvez eles sejam at\u00e9 divertidos, certo? Pode ser?<\/p>\n<p>Independentemente disso, precisamos de uma defini\u00e7\u00e3o com a qual possamos trabalhar ao falar sobre isso pelo resto do artigo.<\/p>\n<p>O manual do PHP <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.rationale.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fornece a seguinte defini\u00e7\u00e3o<\/a> :<\/p>\n<blockquote>\n<p>Os namespaces s\u00e3o projetados para resolver dois problemas que os autores de bibliotecas e aplicativos encontram ao criar elementos de c\u00f3digo reutiliz\u00e1veis, como classes ou fun\u00e7\u00f5es\u2026<\/p>\n<\/blockquote>\n<p>E isso n\u00e3o \u00e9 ruim, mas \u00e9 bem longo, t\u00e9cnico e pode ser um pouco demais para quem est\u00e1 come\u00e7ando. Ent\u00e3o vamos simplificar um pouco para este artigo:<\/p>\n<p>Um pouco melhor, talvez?<\/p>\n<blockquote>\n<p>Uma maneira de agrupar classes e interfaces relacionadas com uma finalidade semelhante.<\/p>\n<\/blockquote>\n<p>N\u00e3o vou falar sobre interfaces nesta palestra; no entanto, eu sei que existem desenvolvedores orientados a objetos de n\u00edvel intermedi\u00e1rio que os usam, ent\u00e3o eu queria ter certeza de pelo menos mencion\u00e1-los.<\/p>\n<h3>Um exemplo pr\u00e1tico<\/h3>\n<p>Eu n\u00e3o gosto de exemplos de programa\u00e7\u00e3o que n\u00e3o d\u00e3o aplica\u00e7\u00f5es pr\u00e1ticas ou do mundo real. Muitas vezes, recebemos exemplos de coisas que nunca codificar\u00edamos.<\/p>\n<p>Quantas vezes voc\u00ea leu um artigo orientado a objetos e ele d\u00e1 um exemplo de uma classe animal ou uma classe de carro? N\u00e3o vamos programar um carro.<\/p>\n<p>\u00c9 muito mais prov\u00e1vel que estejamos trabalhando com arquivos. Ent\u00e3o, vamos dar uma olhada em um conjunto de classes respons\u00e1veis \u200b\u200bpor ler e escrever arquivos. Ou seja, temos sido bons programadores orientados a objetos e separamos nossas classes com base nas responsabilidades que elas mant\u00eam.<\/p>\n<p>E sim, voc\u00ea pode ter interfaces; no entanto, eles est\u00e3o al\u00e9m do escopo deste artigo, portanto, n\u00e3o ser\u00e3o inclu\u00eddos.<\/p>\n<p>Ent\u00e3o, para o nosso FileReader, talvez o b\u00e1sico da classe seja assim:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1413b1bb.jpg\" 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-167194-61e7a1413b1bb.jpg\" alt=\"Namespaces e carregamento autom\u00e1tico no WordPress\" ><\/a><\/p>\n<p>Uma classe para ler arquivos.<\/p>\n<p>Observe que a fun\u00e7\u00e3o aceita o nome do arquivo que deve ser aberto para leitura. A verifica\u00e7\u00e3o de erros, como ele l\u00ea o arquivo e o que ele retorna s\u00e3o deixados para a implementa\u00e7\u00e3o da classe.<\/p>\n<p>E para o FileWriter, temos algo assim:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a143c699f.jpg\" 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-167194-61e7a143c699f.jpg\" alt=\"Namespaces e carregamento autom\u00e1tico no WordPress\" ><\/a><\/p>\n<p>Uma classe para escrever arquivos.<\/p>\n<p>Essa classe, por outro lado, aceita a informa\u00e7\u00e3o que vai gravar no disco e o nome do arquivo no qual deve ser gravada.<\/p>\n<p>Novamente, como no exemplo acima, ele n\u00e3o inclui verifica\u00e7\u00e3o de erros, grava\u00e7\u00e3o por meio de um recurso, fechamento dos recursos e assim por diante.<\/p>\n<p>Mas n\u00e3o se trata de trabalhar com arquivos. Em vez disso, trata-se de mostrar como criar um namespace em seu c\u00f3digo, e esses dois exemplos devem ser fundamentais para isso.<\/p>\n<h3>Notas sobre namespaces<\/h3>\n<p>H\u00e1 uma ressalva para o que voc\u00ea v\u00ea nas imagens do c\u00f3digo de exemplo acima: Essas classes n\u00e3o t\u00eam namespace. Ou seja, eles est\u00e3o residindo no namespace global, o que os deixa prontos para conflitos com outras classes.<\/p>\n<p>Veja da seguinte forma: imagine que voc\u00ea empacota esse c\u00f3digo em um plugin para outra pessoa, e ent\u00e3o eles carregam outro plugin que tamb\u00e9m tem como FileReader ou FileWriter. Como tudo far\u00e1 parte do mesmo <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.global.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">namespace global<\/a>, voc\u00ea enfrentar\u00e1 um conflito.<\/p>\n<p>Lembrar:<\/p>\n<blockquote>\n<p>Os namespaces s\u00e3o uma maneira de agrupar classes e interfaces relacionadas com uma finalidade semelhante.<\/p>\n<\/blockquote>\n<p>Ent\u00e3o vamos pegar as classes e o namespace do c\u00f3digo.<\/p>\n<p>Primeiro, forneceremos um namespace de n\u00edvel superior no qual essas classes e todas as outras classes residir\u00e3o; em seguida, forneceremos um subpacote (ou sub-namespace ou subespa\u00e7o como os ouvi serem chamados) no qual essas classes de arquivo residir\u00e3o.<\/p>\n<p>Isso significa que nosso FileReader agora ficar\u00e1 assim:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a146586f4.jpg\" 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-167194-61e7a146586f4.jpg\" alt=\"Namespaces e carregamento autom\u00e1tico no WordPress\" ><\/a><\/p>\n<p>Uma classe com namespace para leitura de arquivos.<\/p>\n<p>E nosso FileWriter agora ficar\u00e1 assim:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1487e5b2.jpg\" 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-167194-61e7a1487e5b2.jpg\" alt=\"Namespaces e carregamento autom\u00e1tico no WordPress\" ><\/a><\/p>\n<p>Uma classe com namespace para gravar arquivos.<\/p>\n<p>Primeiro, voc\u00ea pode ver que usar namespaces \u00e9 f\u00e1cil: voc\u00ea simplesmente usa a palavra-chave namespace e ent\u00e3o declara o namespace (que poderia facilmente ser WCATL) no topo com os subpacotes a seguir.<\/p>\n<p>Mas isso leva a outros t\u00f3picos \u2013 principalmente sobre organiza\u00e7\u00e3o de arquivos, instancia\u00e7\u00e3o e carregamento autom\u00e1tico \u2013 todos os quais valem a pena serem abordados.<\/p>\n<h3>Na organiza\u00e7\u00e3o do arquivo<\/h3>\n<p>Neste ponto, \u00e9 importante ter uma palavra sobre organiza\u00e7\u00e3o de arquivos. Dependendo de com quem voc\u00ea fala, voc\u00ea vai descobrir que alguns desenvolvedores \u2013 surpresa, surpresa \u2013 t\u00eam uma opini\u00e3o sobre como os arquivos devem ser organizados (e eu n\u00e3o sou diferente).<\/p>\n<p>Por um lado, voc\u00ea n\u00e3o precisa organizar seus arquivos. Na verdade, voc\u00ea pode colocar tudo no diret\u00f3rio raiz do seu projeto, colocar as informa\u00e7\u00f5es no namespace e estar pronto para come\u00e7ar.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14ab117d.jpg\" 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-167194-61e7a14ab117d.jpg\" alt=\"Namespaces e carregamento autom\u00e1tico no WordPress\" ><\/a><\/p>\n<p>Arquivos n\u00e3o organizados<\/p>\n<p>O conjunto de arquivos acima \u00e9 para um projeto pequeno, ent\u00e3o voc\u00ea pode imaginar quantos arquivos existiriam para um projeto grande.<\/p>\n<p>Mas quando voc\u00ea tem seus arquivos organizados assim, pode tornar um pouco dif\u00edcil escrever um autoloader porque um autoloader precisa saber onde encontrar os arquivos com base em seu namespace.<\/p>\n<p>\u00c9 aqui que entram em jogo os termos &#8220;organiza\u00e7\u00e3o l\u00f3gica&#8221; e &#8220;organiza\u00e7\u00e3o virtual&#8221;.<\/p>\n<ul>\n<li>Organiza\u00e7\u00e3o l\u00f3gica refere-se a como os arquivos s\u00e3o organizados no disco, como o que voc\u00ea v\u00ea acima. Eles est\u00e3o localizados logicamente no diret\u00f3rio raiz.<\/li>\n<li>Organiza\u00e7\u00e3o Virtual refere-se a como os arquivos s\u00e3o organizados em rela\u00e7\u00e3o aos seus namespaces. Isso significa que existem diret\u00f3rios e subdiret\u00f3rios que s\u00e3o mapeados para namespaces, subpacotes e assim por diante.<\/li>\n<\/ul>\n<p>Ent\u00e3o, se voc\u00ea pegasse o projeto acima, seus namespaces, seus subpacotes e os organizasse l\u00f3gica e virtualmente, seria algo assim:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14d9a198.jpg\" 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-167194-61e7a14d9a198.jpg\" alt=\"Namespaces e carregamento autom\u00e1tico no WordPress\" ><\/a><\/p>\n<p>Namespaces e carregamento autom\u00e1tico: arquivos organizados<\/p>\n<p>E embora voc\u00ea possa optar por organizar seus arquivos como quiser, sou f\u00e3 de garantir que haja paridade entre os dois. Ou seja, gosto que minha organiza\u00e7\u00e3o l\u00f3gica e virtual combinem como voc\u00ea v\u00ea na imagem acima.<\/p>\n<p>\u00c0 medida que passo a discutir o carregamento autom\u00e1tico, voc\u00ea ver\u00e1 por que isso \u00e9 importante.<\/p>\n<h2>Notas sobre namespaces<\/h2>\n<p>O que acontece, por\u00e9m, quando precisamos instanciar classes com namespace? Quando as classes n\u00e3o t\u00eam namespace, \u00e9 f\u00e1cil usar a palavra-chave &#8216;new&#8217;.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14f8414e.jpg\" 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-167194-61e7a14f8414e.jpg\" alt=\"Namespaces e carregamento autom\u00e1tico no WordPress\" ><\/a><\/p>\n<p>Instancia\u00e7\u00e3o sem um namespace.<\/p>\n<p>Mas temos que instanciar uma classe com namespace, temos que dar um passo adiante e usar o nome totalmente qualificado:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1519c7ff.jpg\" 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-167194-61e7a1519c7ff.jpg\" alt=\"Namespaces e carregamento autom\u00e1tico no WordPress\" ><\/a><\/p>\n<p>Namespaces e Autoloading: Instancia\u00e7\u00e3o com um namespace.<\/p>\n<p>Mas isso fica complicado, n\u00e3o \u00e9? Este exemplo em particular n\u00e3o \u00e9 t\u00e3o ruim, mas imagine se voc\u00ea estivesse trabalhando em algo com mais subpacotes. Ficaria bem trabalhoso, n\u00e3o \u00e9?<\/p>\n<p>Para esse fim, podemos usar o que \u00e9 chamado de aliasing. \u00c9 simples tamb\u00e9m. Podemos definir use a palavra-chave &#8216;use&#8217; no topo do arquivo para fazer refer\u00eancia ao namespace que queremos como alias e ent\u00e3o usar o \u00faltimo subpacote como parte do alias para instanciar nossa classe.<\/p>\n<p>Parece confuso, n\u00e3o \u00e9? Talvez v\u00ea-lo em a\u00e7\u00e3o ajude:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1541531b.jpg\" 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-167194-61e7a1541531b.jpg\" alt=\"Namespaces e carregamento autom\u00e1tico no WordPress\" ><\/a><\/p>\n<p>Alias \u200b\u200bde namespaces.<\/p>\n<p>E isso \u00e9 tudo o que h\u00e1 para isso. Sim, voc\u00ea pode <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.importing.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">levar o alias um passo adiante<\/a>, mas isso \u00e9 o que estou levando no contexto deste artigo.<\/p>\n<h2>Carregamento autom\u00e1tico<\/h2>\n<p>Neste ponto, temos a base para o carregamento autom\u00e1tico. Sim, trabalhar com namespaces pode ser muito trabalhoso se voc\u00ea n\u00e3o estiver acostumado; no entanto, \u00e9 importante entender porque o carregamento autom\u00e1tico requer um pouco de trabalho que pode ser inesperado se voc\u00ea nunca foi apresentado a ele antes.<\/p>\n<p>Independentemente disso, as coisas mais importantes a serem lembradas sobre namespaces, neste momento, s\u00e3o:<\/p>\n<ol>\n<li>Os namespaces s\u00e3o uma maneira de agrupar classes e interfaces relacionadas com uma finalidade semelhante.<\/li>\n<li>Crie paridade por meio de seus arquivos e namespaces, garantindo que sua organiza\u00e7\u00e3o l\u00f3gica e virtual seja a mesma.<\/li>\n<\/ol>\n<p>E agora \u00e9 hora de olhar para o carregamento autom\u00e1tico.<\/p>\n<h3>Notas sobre carregamento autom\u00e1tico<\/h3>\n<p>Primeiro, vamos ver a defini\u00e7\u00e3o de autoload conforme fornecida <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.autoload.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pelo manual do PHP<\/a> :<\/p>\n<blockquote>\n<p>A fun\u00e7\u00e3o spl_autoload_register() registra qualquer n\u00famero de autoloaders, permitindo que classes e interfaces sejam carregadas automaticamente se n\u00e3o estiverem definidas no momento. Ao registrar autoloaders, o PHP recebe uma \u00faltima chance de carregar a classe ou interface antes que falhe com um erro.<\/p>\n<\/blockquote>\n<p>N\u00e3o \u00e9 ruim. \u00c9 longo, no entanto. Assim como fizemos com namespaces, vamos usar uma defini\u00e7\u00e3o mais curta para este artigo:<\/p>\n<blockquote>\n<p>Uma maneira de carregar automaticamente interfaces e classes sem usar instru\u00e7\u00f5es include e require.<\/p>\n<\/blockquote>\n<p>Novamente, n\u00e3o usaremos interfaces neste artigo, embora alguns desenvolvedores o fa\u00e7am. E isso fornecer\u00e1 a defini\u00e7\u00e3o de trabalho para o restante deste artigo.<\/p>\n<h3>Um exemplo pr\u00e1tico<\/h3>\n<p>Depois de ter seus arquivos organizados, com namespaces e prontos para carregar, \u00e9 hora de fazer exatamente isso, certo? Quero dizer:<\/p>\n<ol>\n<li>seus arquivos est\u00e3o organizados,<\/li>\n<li>voc\u00ea est\u00e1 pronto para carreg\u00e1-los<\/li>\n<\/ol>\n<p>Ent\u00e3o \u00e9 hora de fazer isso automaticamente, certo? Mas h\u00e1 um problema. Todo o &#8220;carregamento autom\u00e1tico&#8221; de arquivos requer um pouco de trabalho.<\/p>\n<h3>Escrevendo um Autoloader<\/h3>\n<p>Ou seja, \u00e9 autom\u00e1tico, mas ainda exige um pouco mais de trabalho da nossa parte. Antes de entrar nessas etapas, \u00e9 importante observar:<\/p>\n<ol>\n<li>n\u00e3o \u00e9 totalmente automatizado,<\/li>\n<li>temos que escrev\u00ea-lo.<\/li>\n<\/ol>\n<p>Por mais legal que fosse ter o c\u00f3digo carregado automaticamente, temos que ler alguns dados, analis\u00e1-los e tentar carregar o arquivo apropriado.<\/p>\n<p>Mas supondo que voc\u00ea o escreva corretamente e seu namespace e organize seus arquivos da mesma maneira para cada projeto, voc\u00ea pode reutilizar seu autoloader. Ou seja, voc\u00ea escreve uma vez e pode us\u00e1-lo em outros projetos.<\/p>\n<h3>Etapas para um carregador autom\u00e1tico<\/h3>\n<p>Ao escrever um autoloader, h\u00e1 apenas alguns passos a seguir. O autoloader deve ser capaz de responder aos seguintes arquivos:<\/p>\n<ol>\n<li>Onde est\u00e3o os arquivos?<\/li>\n<li>Como eles s\u00e3o nomeados?<\/li>\n<li>O arquivo existe?<\/li>\n<\/ol>\n<p>Se todos os itens acima forem verdadeiros (ou voc\u00ea puder responder &#8220;sim&#8221; a todos eles), o autoloader far\u00e1 o que deve fazer.<\/p>\n<p>Daremos uma olhada em algum c\u00f3digo em um momento, mas a primeira coisa a notar \u00e9 que ele usa uma fun\u00e7\u00e3o chamada spl_autoload_register.<\/p>\n<p>SPL refere-se \u00e0 <a href=\"https:\/\/php.net\/manual\/en\/book.spl.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Biblioteca PHP Padr\u00e3o<\/a>, e a fun\u00e7\u00e3o aceita uma fun\u00e7\u00e3o como argumento, e essa fun\u00e7\u00e3o aceita o nome da classe que ser\u00e1 instanciada. \u00c9 mais procedimental do que orientado a objetos, e falarei sobre isso brevemente, mas \u00e9 importante ter em mente enquanto voc\u00ea l\u00ea este c\u00f3digo.<\/p>\n<p>Aqui est\u00e1 a primeira parte do c\u00f3digo. Vou explicar o que est\u00e1 fazendo depois do fato:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1562a1b8.jpg\" 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-167194-61e7a1562a1b8.jpg\" alt=\"Namespaces e carregamento autom\u00e1tico no WordPress\" ><\/a><\/p>\n<p>Autoloading, Parte 1 &#8211; Encontrando a classe<\/p>\n<p>Nesta parte do c\u00f3digo, a fun\u00e7\u00e3o recebe o nome totalmente qualificado da classe a ser instanciada (como &#8220;WCATLFileFileReader()&#8221;).<\/p>\n<p>Em seguida, ele separa todas as partes do nome totalmente qualificado em partes. O nome da classe \u00e9 o \u00faltimo \u00edndice do array, e opto por nomear meus arquivos como &#8220;class-filereader.php&#8221; para que a fun\u00e7\u00e3o crie uma vari\u00e1vel, $class_file, que se refira ao nome do arquivo.<\/p>\n<p>Mas ainda n\u00e3o terminamos. Ainda temos que obter o nome totalmente qualificado (ou seja, onde o arquivo est\u00e1 localizado no disco). Isso pode ser algo assim:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a15910c7c.jpg\" 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-167194-61e7a15910c7c.jpg\" alt=\"Namespaces e carregamento autom\u00e1tico no WordPress\" ><\/a><\/p>\n<p>Autoloading, Parte 2 \u2013 Obtendo o nome totalmente qualificado<\/p>\n<p>Neste ponto, preparamos uma vari\u00e1vel, $full_qualified_path, que far\u00e1 refer\u00eancia ao diret\u00f3rio de n\u00edvel superior.<\/p>\n<p>Em seguida, o c\u00f3digo percorre todos os \u00edndices do array e cria um caminho para o arquivo de classe. Voc\u00ea pode imaginar isso como construir uma string como &#8220;wcatlfile&#8221; que combinamos com o $class_file.<\/p>\n<p>Isso significa que o caminho totalmente qualificado para o arquivo se torna &#8220;wcatlfileclass-filereader.php&#8221;.<\/p>\n<p>E, finalmente, inclu\u00edmos o arquivo. Observe que esse c\u00f3digo n\u00e3o est\u00e1 verificando se o arquivo existe. Embora eu recomende, ele foi deixado de fora por causa do tamanho e porque, em nosso exemplo, sabemos que o arquivo existe.<\/p>\n<p>Se o arquivo n\u00e3o existir, existem v\u00e1rias op\u00e7\u00f5es:<\/p>\n<ol>\n<li>Lan\u00e7a uma exce\u00e7\u00e3o,<\/li>\n<li>Pegar uma exce\u00e7\u00e3o,<\/li>\n<li>Exibir uma mensagem de erro de sua prefer\u00eancia,<\/li>\n<li>Ou alguma outra op\u00e7\u00e3o que eu possa estar considerando neste artigo.<\/li>\n<\/ol>\n<p>Independentemente disso, a ideia \u00e9 ser defensivo em seu c\u00f3digo para que voc\u00ea possa se preparar para o caso de um arquivo n\u00e3o existir e poder lidar com a falha normalmente.<\/p>\n<h3>No carregamento autom\u00e1tico<\/h3>\n<p>Antes de concluir, \u00e9 importante observar o seguinte:<\/p>\n<ul>\n<li>Ao longo do exemplo, usamos c\u00f3digo orientado a objetos ao colocar o namespace no c\u00f3digo. Afinal, \u00e9 um conceito orientado a objetos.<\/li>\n<li>Nosso autoloader \u00e9 escrito em c\u00f3digo procedural. O que da?<\/li>\n<\/ul>\n<p>Em \u00faltima an\u00e1lise, isso tem a ver com a Biblioteca PHP Padr\u00e3o. Voc\u00ea pode escrever um autoloader orientado a objetos, mas acho que \u00e9 um pouco exagerado em muitos casos.<\/p>\n<p>O processo de carregamento de um arquivo \u00e9 um processo passo a passo, portanto, escrev\u00ea-lo de maneira processual \u00e9 um ajuste natural.<\/p>\n<p>Finalmente, outros podem optar por usar ferramentas como o Composer para trazer depend\u00eancias. Essas s\u00e3o \u00f3timas ferramentas, e h\u00e1 muitas vantagens em usar algo assim; no entanto, est\u00e1 al\u00e9m dos conceitos e t\u00f3picos deste artigo e \u00e9 melhor deixar para uma palestra futura.<\/p>\n<h2>Recursos (e obrigado!)<\/h2>\n<p>Este foi um dos artigos mais longos que escrevi para o meu site.<\/p>\n<p>Isso ocorre em parte porque \u00e9 baseado em uma palestra para um WordCamp e tamb\u00e9m porque quero ter certeza de fornecer uma introdu\u00e7\u00e3o e base s\u00f3lidas onde voc\u00ea pode come\u00e7ar a incorporar namespaces e carregamento autom\u00e1tico em seus plugins do WordPress.<\/p>\n<p>Al\u00e9m deste artigo, tamb\u00e9m forneci os seguintes recursos:<\/p>\n<ul>\n<li>Os slides da minha apresenta\u00e7\u00e3o est\u00e3o <a href=\"https:\/\/speakerdeck.com\/tommcfarlin\/namespaces-and-autoloading-improving-wordpress-plugin-architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dispon\u00edveis no SpeakerDeck<\/a>.<\/li>\n<li>Tenho o c\u00f3digo desta apresenta\u00e7\u00e3o dispon\u00edvel <a href=\"https:\/\/github.com\/tommcfarlin\/namespaces-and-autoloading-in-wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">para download no GitHub<\/a>.<\/li>\n<\/ul>\n<p>E com isso, espero que isso forne\u00e7a uma introdu\u00e7\u00e3o s\u00f3lida para namepsaces e carregamento autom\u00e1tico e que voc\u00ea possa come\u00e7ar a incorporar isso cada vez mais em seu trabalho. Isso beneficia muito seu trabalho e outros desenvolvedores que podem acabar usando seu trabalho tamb\u00e9m.<\/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>Com base em minha palestra no WordCamp Atlanta 2017, este \u00e9 meu artigo abrangente sobre namespaces e carregamento autom\u00e1tico no desenvolvimento do WordPress.<\/p>\n","protected":false},"author":1,"featured_media":221177,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,846,867],"tags":[1170],"class_list":["post-229317","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","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\/229317","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=229317"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229317\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/221177"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}