Isto é o que o PHP moderno parece

Por Faraz Usmani (Flickr) [CC BY 2.0 ( http://creativecommons.org/licenses/by/2.0 )], através do Wikimedia Commons

O título é realmente pretensioso, não é? Sim é. Embora eu tenha trabalhado com PHP há anos, como posso indicar quais são as melhores práticas e ferramentas para o trabalho? Não pude, mas vou fazer isso.

Estou vendo uma mudança real na forma como os desenvolvedores estão fazendo seu trabalho com o PHP, não só a linguagem está mudando drasticamente para se tornar mais madura e robusta com novas versões e melhorias, mas todo o ecossistema em torno dela está mudando.

Novas ferramentas, bibliotecas, frameworks e artigos estão sendo criados, padrões estão sendo definidos para tornar o código mais elegante e fácil de entender. Várias pessoas estão pensando em maneiras de tornar o trabalho (e sua vida como desenvolvedor) mais produtivo, limpo e divertido.

Eu não sou um adotador precoce de novas tendências, na verdade, eu apenas adotam uma nova ferramenta quando tenho certeza de que há uma comunidade por trás disso e eu realmente acho que vai melhorar meu trabalho. O que sempre faço é tentar escrever meu código seguindo as melhores práticas.

Por isso, me levou tempo para começar a usar coisas como Composer e PHPUnit. Cerca de um ano atrás, mais ou menos, abri meu coração para todas essas novidades brilhantes.

O PSR veio primeiro, depois Composer, PHPUnit, Travis-ci e várias outras bibliotecas e ferramentas incríveis. Estou até usando um IDE agora (Vim FTW, mas PHPStorm com integração XDebug é uma obrigação para um fluxo de trabalho sano)!

O que é moderno?

Por Karen Roe (Flickr) [CC BY 2.0 ( http://creativecommons.org/licenses/by/2.0 )]

Há toneladas de artigos na web sobre o horrível PHP, como sua vida seria terrível se você tivesse que trabalhar com o código PHP, como o idioma é feio e tudo o que você poderia pensar!

Se você estiver trabalhando com código legado, talvez sua vida não seja tão boa, mas se você tiver a oportunidade de trabalhar em um novo projeto e puder usar todas as novas ferramentas, você vai ver esse novo PHP Eu vou falar.

Tenho vários problemas para trabalhar com PHP diariamente, mas não se pode fechar os olhos para as mudanças que ocorrem na linguagem, na comunidade e no ecossistema. Há uma longa caminhada à frente, mas as coisas estão ficando maduras na terra do PHP.

Comecei a criar um SDK para uma API interna na empresa para a qual trabalho, assim como um projeto de estimação, e decidi seguir as melhores práticas. A maioria deles já estava fazendo, mas fiz algumas mudanças na maneira como faço algumas coisas. Essas mudanças e o que aprendi no ano passado são o assunto deste artigo e do que eu chamo de PHP Moderno.

Vamos começar com o fluxo de trabalho

TRIO FABRIKKER – https://nos.twnsnd.co

Como eu disse, sou um recém-chegado a essa coisa IDE, mas foi amor à primeira vista. PHPStorm é um ótimo e excelente software. É o meu primeiro e único IDE. Foi minha tentativa de punho e eu nem precisei tentar qualquer outro.

A integração com o XDebug é perfeita, a resolução do espaço para nome do PHP, a integração do compositor, a integração do git, o auto-preenchimento, a geração de código, a refatoração de código. Eu poderia continuar continuando.

Eu não acho que você deve usar um IDE, na verdade, esse ponto é completamente pessoal. Você deve usar o que quiser às suas necessidades – Vim, Atom, Emacs, Bracket, NetBeans, PHPStorm, Eclipse, seja o que for. Dois pontos importantes aqui são produtividade e ergonomia. Seu IDE / editor de texto deve estar lá para ajudá-lo.

No entanto, para mim, um excelente ponto é a integração do depurador. Para escrever código para grandes projetos (mesmo para os pequenos), você precisa usar um depurador decente. Vamos esquecer esses var_dumps e print_rs. Você precisa picar essas variáveis ??no tempo de execução, analisar traços de pilha, definir pontos de interrupção. Essas coisas são essenciais e facilitam o desenvolvimento e a refatoração.

Eu nem sei se existem outras opções aqui, o XDebug tem tudo que você precisa. Você tem alguns minutos? Se ainda não fez isso, tome um momento para configurar o XDebug e integrá-lo ao seu IDE ou editor de texto. Comece a depurar seu código usando as ferramentas certas.

A outra ferramenta em que quero chamar a atenção é o GitHub. Outro artigo inteiro poderia ser escrito sobre o quão bom Git e GitHub são e por que você deve começar a manter seu código em um sistema de versão. Mas eu quero mostrar-lhe outro motivo.

O foco aqui é a integração.

Existem várias ferramentas que se integram ao GitHub e você deve começar a usá-las. Essas ferramentas podem gerar métricas, executar testes, executar trabalhos para você durante um processo de integração contínua e fazer todo o tipo de coisas em seu fluxo de trabalho. A integração é uma boa razão para você começar a usar o GitHub, todos os outros estão sujeitos por outro momento.

Gerenciamento de dependência

INSTITUTO PASTEUR. LISBOA, PORTUGAL – https://nos.twnsnd.co

Outro ponto neste moderno ecossistema PHP é o gerenciamento de dependências, e o Composer é a ferramenta para o trabalho.

Compositor tem 5 anos, mas parece-me que a adoção maciça ocorreu há alguns anos. Talvez porque não sou um adotador inicial ou talvez porque os desenvolvedores PHP estão relutantes em mudar.

Esta ferramenta fornece uma interface para o Packagist, que é um repositório de pacotes PHP que consiste em bibliotecas PHP, projetos e ferramentas, cujo código-fonte é armazenado em Github (ou outros locais como o BitBucket).

Todas as bibliotecas nas quais eu estou falando neste artigo, e talvez um desses projetos de estimação, pode ser adicionado ao seu projeto com um simples

 $ compositor exige package_vendor / package_name 

Se você não conhece o vendedor de um pacote, você pode search um pacote para encontrar e instalar o caminho certo.

 $ composer search package_name 

O compositor seria uma ótima ferramenta se ele simplesmente fizesse isso funcionar, gerenciasse dependências, mas faz muito mais. Tire um tempo para instalar o Composer e leia a documentação .

Interface de linha de comando feita à direita

Eu realmente gosto de tentar idéias rapidamente usando interfaces CLI. Para mim, uma das maiores ferramentas REPL é o IPython . Isso ajuda você a preencher automaticamente seu código, permitir que você defina facilmente funções, facilite o acesso à documentação e vários outros recursos incríveis. A desvantagem para nós, a ferramenta é para Python, não PHP.

No mundo do PHP, temos algo chamado "modo interativo", que pode ser acessado pelo terminal, apenas digitando

 $ php -a 
Modo interativo ativado
 php> 

Neste ponto, você está no modo interativo e pode começar a testar algo. Funciona, mas a ferramenta não é muito intuitiva. Eu tentei várias vezes, mas, como eu sabia o que o IPython conseguia fazer, não conseguiria usá-lo.

Para a nossa sorte, há uma nova CLI fresca (interface de linha de comando) no bloco e seu nome é Psysh. Psysh é uma ferramenta incrível, cheia de recursos interessantes e pode ser instalada globalmente ou por projeto usando o compositor.

O melhor recurso de Psysh para mim é documentação interna. Acessar o documento para uma função PHP sem encaminhar para Php.net é ótimo. A desvantagem é que você precisa fazer algumas coisas antes de ser totalmente funcional.

Depois de instalá-lo, digite os seguintes comandos (estou usando o Debian aqui, isso pode não funcionar para todos) para que ele funcione corretamente

 $ apt-get install php7.1-sqlite3 
$ mkdir / usr / local / share / psysh
$ wget http://psysh.org/manual/en/php_manual.sqlite -o /usr/local/share/psysh/php_manual.sqlite

O primeiro comando não é obrigatório e, se você tiver o Sqlite já instalado, pode ignorar esta etapa. O segundo comando cria o diretório para armazenar a documentação e a terceira linha de downloads e salvar o documento no diretório criado anteriormente. Lembre-se, todos esses comandos devem ser executados como root.

Agora você tem isso

Captura de tela do psysh doc em ação, mostrando informações sobre json_decode

Dirija-se a Psysh e saiba mais sobre esta ótima ferramenta.

Você deve começar a testar

Este é um mantra que estou me dizendo todos os dias. Como muitas pessoas, eu não teste o meu código tanto quanto a TDD sugere. Estou começando a testar agora e tenho feito isso durante a última metade do ano, e há uma longa jornada.

Eu decidi aprender sobre testes ao trabalhar com um projeto de legado complexo. O código era tão frágil e rígido que, sempre que adicionamos algum código, quebrou algo. Novo recurso? Implementar e quebrar alguma coisa! Corrigindo um bug? Crie outro.

Esse foi um grande problema, que eu discuti em outro artigo , e me fez começar a dar provas uma chance.

A primeira ferramenta que me foi apresentada foi o PHPUnit . Conforme indicado no site oficial

PHPUnit é uma estrutura de teste orientada por programador para PHP.
É uma instância da arquitetura xUnit para estruturas de teste de unidade.

Então, PHPUnit é uma estrutura para ajudá-lo a criar testes para seus projetos, testes unitários. Ele oferece várias funções para testar o resultado do seu código e gerar um bom resultado com o resultado desses testes.

Desde que comecei a pensar em testes, lendo e conversando com as pessoas sobre isso, descobri uma outra ótima ferramenta, que complementa o trabalho que você colocou naqueles testes unitários, é a Behat, que é uma estrutura BDD para o PHP.

BDD (Behavior-Driven Development) é um processo de desenvolvimento que veio de TDD (Test-Driven Development). Essas siglas não são importantes agora, o que é importante é que você pode especificar seus testes usando uma linguagem mais natural, um idioma que pessoas não-técnicas podem entender.

Esta linguagem é chamada de Pepino e é usada para descrever o comportamento esperado que está sendo testado. Uma descrição do teste, usando Gherkin, parece assim

Por trás dessas linhas, existe o código PHP chamado quando há uma correspondência entre uma linha e um padrão regex especificado no PhpDoc do método. Este código implementa essas etapas e o que um usuário real faria, usando seu SDK, aplicativo ou sistema web.

O fluxo de trabalho com Behat é tão suave. Depois de tudo configurado corretamente, você começa a escrever todos os cenários possíveis para testar um recurso. Na primeira vez que você executa o Behat, ele fornece todos os modelos de métodos que você deve adicionar à sua classe Contexto PHP, para implementar cada etapa em um cenário.

Depois disso, você começa a escrever o código real para cada etapa e continue repetindo esse ciclo.

  • Implementar código PHP para um passo
  • Executar testes
  • Se tudo estiver bem, escreva o código PHP para outro passo
  • Se algo estiver quebrado, conserte

Após meia hora de configurar e ler a documentação, você está preparado para usar o Behat, você verá que, no final, é todo o código PHP e você já sabe como programar com ele.

Integração contínua

Integração contínua (CI) é um processo – uma maneira de fazer algo, e isso, para nós, engenheiros de software, é criar software.

Em linguagem simples, é o ato de incorporar pequenos pedaços de código constantemente (talvez várias vezes ao dia) em sua base de código. Código que foi testado e não quebrou nada. A CI ajuda você a automatizar a construção, teste e implantação de seus aplicativos.

Com alguns cliques, você pode integrar o seu projeto GitHub com a Travis CI e cada empurrão para o seu repositório executará os testes que você criou com PHPUnit e Behat, informando se o último recurso que você implementou está pronto ou não para ser mesclado . Além disso, você pode usar o Travis CI para implantar seu código na produção e no encanamento.

Ter um bom pipeline de trabalho com um processo bem definido é ótimo e a Travis CI pode ajudá-lo com este trabalho. Siga este bom Começando e descubra o quão interessante é pensar sobre o processo de desenvolvimento de software, não apenas o próprio código.

Aderir ao PSR-1 e PSR-2

Se você não sabe o que é o PSR, você deveria. Na verdade, o PSR representa as Recomendações Padrão do PHP e é proposto pela PHP-FIG (PHP Framework Interop Group), um consórcio formado por membros dos maiores projetos, frameworks e CMSs do PHP, que estão pensando no futuro da linguagem, do ecossistema e da discussão padrões a serem seguidos.

Durante muito tempo, o PHP não tinha estilo de codificação. Eu não sou tão velho, mas sempre que eu olhava para o projeto ou biblioteca de alguém, estava seguindo um estilo diferente. Às vezes, o suporte foi deixado em uma posição, às vezes foi colocado na próxima linha, diferentes abordagens foram usadas para lidar com linhas longas e todas as outras combinações de estilo e preferência que você poderia pensar. Foi uma bagunça.

O PHP-FIG faz muitos outros trabalhos, mas, propondo uma única unidade de código, eles estão dizendo: "Paremos de nos preocupar com o estilo de código, deixe todos seguir um padrão e começar a pensar em criar um ótimo software". Agora, sempre que você olha o código de alguém, você simplesmente se preocupa em entender como funciona, não culpando o formato, a estrutura.

Há, até o final deste artigo, 9 aceitaram PSRs propondo soluções comuns para problemas comuns. Mas se você não sabe nada sobre esses padrões, comece com o PSR-1 e o PSR-2 .

Esses padrões propõem o estilo de codificação PHP moderno. Certifique-se de lê-los antes de começar a usá-los. Não pense que você se lembrará de todos eles ao codificar, é um processo, mas para ter certeza, existem ferramentas para ajudá-lo.

PHP CodeSniffer é uma ferramenta que você pode encontrar no Packagist que você pode instalar com o Composer. Não acho que o nome do repositório tenha sido a melhor escolha, porque ele envia duas ferramentas diferentes, php e phpcbf.

A Phpcs é o código sniffer, ele digitalizará seu código inteiro, procurando peças que não seguem o padrão de codificação configurado.

Você pode usar vários padrões de codificação com o phpcs e você pode mesmo criar o seu próprio. No final da verificação de código, o phpcs mostra uma lista dos pedaços de código que não seguem o padrão. É ótimo.

Agora, como mudar tudo o que está errado? Você pode abrir todos os arquivos, alterar o código, executar o php novamente, ver o erro não sendo exibido e repetir o processo. Vai ser extra chato.

Para resolver este problema, o PHP CodeSniffer veio com outra ferramenta, chamada phpcbf ou HTML Code Beautifier. Você executa o phpcbf, seguindo o mesmo conjunto de regras e, voilá, ele corrige tudo para você, ou tenta fazer o seu melhor sem quebrar seu código.

Tente criar o hábito de executar php e phpcbf antes de pressionar qualquer alteração no seu código para o repositório, isso irá garantir que todos os seus códigos adiram aos padrões e se alguém gosta da sua ferramenta / projeto e quer contribuir, eles não terão problema lendo isso.

Estruturas

Não vou dedicar muito tempo a discutir estruturas. Existem vários bons lá fora, cada um com seus altos e baixos. Pessoalmente, eu prefiro não usar esses grandes quadros, com tudo dentro. Eu gosto da idéia de que você deve usar exatamente o que você precisa.

Se você precisar de um cliente HTTP, use Guzzle. Se você precisa de um motor de modelo, use Twig. Se você precisa de um roteador, encontre um bom componente que se adapte às suas necessidades e use-o. Junte esses componentes e crie sua aplicação.

Symfony está fazendo um excelente trabalho para esse conceito. Você pode usar todo o framework para um projeto, ou você pode simplesmente aceitar o que quiser e usá-lo. Simples assim.

No entanto, sempre que preciso de uma estrutura para escrever um aplicativo, escolhi um dos chamados microframeworks. Eles são realmente pequenos, oferecem apenas o básico e são fáceis de personalizar e mais fáceis de fazê-los seguir a estrutura do seu projeto.

Meu microframework de escolha é Slimframework e acho que você deve ler sobre isso. É simples fazer pequenos projetos, mas fica um pouco mais complexo para os maiores.

Por sinal, e isso é para aqueles que estão começando com a programação, eu realmente acho que, antes de adotar uma estrutura e morrer por isso, você deve tentar criar o seu próprio. Isso lhe dará a compreensão de todo o mecanismo e facilitará a adoção de um grande.

O conjunto de ferramentas PHP moderno

Vamos terminar este artigo com uma lista de links. Para mim, esses componentes, ferramentas e bibliotecas representam uma grande parte do que o PHP moderno é:

  • Slimframework : um microframework legal e legal
  • Symfony : uma estrutura maior que é preenchida com componentes excelentes e reutilizáveis
  • Guzzle : um cliente HTTP simples e fácil de usar
  • PHPUnit : uma estrutura para teste unitário
  • Behat : uma estrutura para o desenvolvimento dirigido pelo comportamento
  • PHPCS / CBF : código sniffer e código embelezar
  • Faker : gerador de dados falso
  • Psysh : um console de desenvolvimento de tempo de execução (CLI) cheio de recursos surpreendentes
  • Compositor : gerenciamento de dependência e outros recursos úteis
  • Packagist : repositório de pacotes
  • Twig : modelo de motor

O título era realmente pretensioso, eu sei. O que eu realmente queria mostrar aqui é que o PHP está evoluindo e o ecossistema está evoluindo ao mesmo ritmo (talvez mais rápido).