Uma introdução à recomendação padrão do PHP (PSR)

Publicados: 2019-12-24

Era uma vez, em uma conferência, os desenvolvedores líderes de uma seleção de frameworks sentaram-se na mesma sala e concordaram com alguns padrões para todos os seus projetos usarem. O objetivo era tornar os frameworks e bibliotecas PHP mais fáceis de combinar para os usuários. Foi quando o php-fig: the PHP Framework Interop Group nasceu. Esse grupo de pessoas incríveis supervisiona as recomendações de padrões do PHP (PSRs).


O PHP Standard Recommendation (PSR) é uma especificação do PHP publicada pelo PHP Framework Interoperability Group (PHP-FIG). Atende a padronização de conceitos de programação em PHP. O objetivo é permitir a interoperabilidade dos componentes. O PHP-FIG é formado por vários fundadores de frameworks PHP.

PSR-0 e PSR-4

Descrevem uma especificação para classes de carregamento automático de caminhos de arquivo. PSR-0 e PSR-4 são padrões relativos a namespaces, nomes de classes e caminhos de arquivos. Este PSR também descreve onde colocar os arquivos que serão carregados automaticamente de acordo com a especificação.

Carregamento automático

O carregamento automático é uma funcionalidade que ajuda os desenvolvedores a incluir classes PHP automaticamente, sem escrever declarações de inclusão / solicitação desordenadas em todos os lugares.
No PHP, a definição da classe é carregada com as instruções require ou include nos arquivos que estão sendo chamados, ou seja, antes de usá-la como mostrado abaixo.

imagem psr 1

A abordagem acima levanta alguns problemas, como se tivéssemos dezenas de classes externas para serem usadas em um arquivo e começássemos a escrever linhas de instruções de requerer / incluir logo no início de um arquivo de origem.

Para superar esse problema, o PHP 5 introduziu a função mágica __autoload () que é chamada automaticamente quando seu código faz referência a uma classe ou interface que ainda não foi carregada.

imagem 2 psr

Aqui está um exemplo de implementação básica de __autoload ():

psr_image3

A principal desvantagem da função __autoload () é que você só pode fornecer um autoloader com ela. O PHP 5.1.2 introduziu outra função de carregamento automático (spl_autoload_register) para lidar com a limitação de __autoload.

A introdução de spl_autoload_register () deu aos programadores a habilidade de criar uma cadeia de autoload, uma série de funções que podem ser chamadas para tentar carregar uma classe ou interface.

Por exemplo:

psr_image4psr_image5

O carregamento automático foi uma ideia tão boa que todos os projetos começaram a usá-lo. Inevitavelmente, todos criaram sua própria versão do autoloader, pois faltavam padrões uniformes. Claramente, o PHP precisava desesperadamente de um padrão para autoloader, que foi como o PSR-0 nasceu. O último padrão de autocarregador aceito é PSR-4.

PSR-0 (padrão de carregamento automático)

Visão geral do PSR-0:

  • Um namespace totalmente qualificado e uma classe devem ter a seguinte estrutura
    \ <Vendor Name> \ (<Namespace> \) * <Class Name>
  • Cada namespace deve ter um namespace de nível superior (“Nome do fornecedor”).
  • Cada namespace pode ter quantos subnamespaces desejar.
  • Cada separador de namespace é convertido em DIRECTORY_SEPARATOR ao carregar do sistema de arquivos.
  • Cada caractere _ no NOME DA CLASSE é convertido em DIRECTORY_SEPARATOR. O caractere _ não tem nenhum significado especial no namespace.
  • O namespace totalmente qualificado e a classe são sufixados com .php ao carregar do sistema de arquivos.
  • Os caracteres alfabéticos em nomes de fornecedores, namespaces e nomes de classes podem ser de qualquer combinação de minúsculas e maiúsculas.

Exemplos:

\ Doctrine \ Common \ IsolatedClassLoader =>
/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php

\ Symfony \ Core \ Request =>
/path/to/project/lib/vendor/Symfony/Core/Request.php

PSR-4 (padrão de carregamento automático)

Visão geral do PSR-4:

  • O termo “classe” refere-se a classes, interfaces, características e outras estruturas semelhantes.
  • Um nome de classe totalmente qualificado tem o seguinte formato:
    \ <NamespaceName> (\ <SubNamespaceNames>) * \ <Namespace>
  • O nome de classe totalmente qualificado DEVE ter um nome de namespace de nível superior, também conhecido como “namespace do fornecedor”.
  • O nome de classe totalmente qualificado PODE ter um ou mais nomes de sub-namespace.
  • O nome de classe totalmente qualificado DEVE ter um nome de classe final.
  • Os sublinhados não têm nenhum significado especial em qualquer parte do nome totalmente qualificado da classe.
  • Os caracteres alfabéticos no nome de classe totalmente qualificado PODEM ser qualquer combinação de letras minúsculas e maiúsculas.
  • Todos os nomes de classes DEVEM ser referenciados diferenciando maiúsculas de minúsculas.

Exemplo de carregamento automático baseado em PSR-4 usando o Composer:

  • Considere a seguinte estrutura de diretório para obter o carregamento automático baseado em PSR-4 usando o composer.
psr_image6
  • Crie um arquivo composer.json usando composer init. Caso contrário, você pode criar um manualmente agora na raiz do seu projeto.
psr_image7
  • Configure o carregamento automático de PSR4 editando o arquivo composer.json conforme mostrado abaixo:
psr_image8
  • Aqui, CodeCourse é o nome do fornecedor do seu aplicativo, você pode usar esse nome enquanto faz o namespace de arquivos dentro do seu diretório src, como:
    psr_image9

    Ou

psr_image10

etc,

  • E src é o diretório do seu aplicativo que você deseja carregar automaticamente.
  • Em seguida, abra seu terminal e digite o seguinte comando para instalar arquivos de carregamento automático em seu projeto. Isso irá gerar o diretório do fornecedor e o arquivo autoload.php dentro dele.
psr_image11
  • Vamos primeiro criar algumas classes dentro do diretório CodeCourse.

Crie AuthFilters.php dentro de CodeCourse / Filters

psr_image11

Crie UserRepository.php dentro de CodeCourse / Repositories

psr_image12
  • Finalmente, crie um arquivo index.php para testá-lo e precisa requerer uma vez o arquivo autoload.php uma vez em seu arquivo index.php.
psr_image14

PSR-1 e PSR-2

PSR-1 e PSR-2 são úteis para padrões de codificação PHP. O PSR-1 concentra-se principalmente no padrão de codificação básico para PHP, enquanto o PSR-2 é mais como uma versão expandida do PSR-1. PSR-1 lista um conjunto de regras simples para convenções de nomenclatura e PSR-2 fornece um guia de estilo de codificação mais abrangente.

PSR-1 (padrão de codificação básico)

Visão geral do PSR-1:

  • Apenas <? Php ou <? = São permitidos para tags PHP.
  • Os nomes das classes devem ser definidos em UpperCamelCase.
  • As variáveis ​​de classe devem ser definidas em camelCase.
  • As constantes de classe devem ser definidas em UPPER_SNAKE_CASE.
  • Os nomes dos métodos devem ser definidos em camelCase.
  • Os arquivos DEVEM declarar símbolos (classes, funções, constantes, etc.) ou causar efeitos colaterais (por exemplo, gerar saída, alterar configurações .ini, etc.), mas NÃO DEVEM fazer ambos. Ou seja,
psr_image15

O exemplo acima causa um efeito colateral, ou seja, carregar um arquivo chamado “file.php”.

  • Os arquivos devem estar em UTF-8 sem BOM (Byte Order Mark).
  • Os namespaces e nomes de classes devem seguir os padrões em PSR-0 e PSR-4.

Aqui está um exemplo que ilustra as convenções de nomenclatura básicas para propriedades, classes e métodos.

psr_image16

PSR-2 (Guia de estilo de codificação)

Visão geral do PSR-2:

  • Você deve seguir os padrões de codificação PSR-1.
  • 4 espaços devem ser usados ​​para indentações. O uso de guias não é permitido.
  • Não há limite para o comprimento da linha, mas deve ter menos de 120 caracteres e, melhor, menos de 80.
  • Deve haver uma linha em branco após a declaração do namespace e uma linha em branco após o bloco de declaração de uso.
  • A abertura das chaves para classes e métodos deve ir na próxima linha e o fechamento das chaves deve ir na linha após o corpo.
  • Métodos e propriedades devem ser definidos com abstract / final primeiro, seguido de public / protected e finalmente static keyword.
  • Você não deve colocar uma nova linha antes de colchetes em declarações condicionais.
  • Você não deve colocar nenhum espaço antes de (e) em declarações condicionais.
  • Um exemplo para definir classes:
  • Você deve abrir as chaves na nova linha e as palavras-chave extends e implements devem ser usadas em uma única linha.
psr_image17

Se houver várias interfaces a serem implementadas, você pode escrever os nomes das interfaces na nova linha, conforme mostrado abaixo:

psr_image18

Exemplo para mostrar como os métodos são definidos em PHP:
Ao definir os métodos, os argumentos devem ser escritos na mesma linha. Além disso, você não deve colocar nenhum espaço em branco antes das vírgulas nos argumentos e deve colocar um espaço em branco após eles.

psr_image19

Se houver muitos argumentos, eles podem ser escritos em nova linha, um após o outro:

psr_image20

Ao definir métodos, você deve ter public / protected / private e abstract / final. Os modos de visibilidade vêm após a palavra-chave resumo / final, se usada. estático é o último modificador.

psr_image21

Declarações condicionais

  • Você deve colocar um espaço em branco antes de (
  • Você não deve colocar nenhum espaço em branco após (
  • Você não deve colocar nenhum espaço em branco antes)
  • Você deve colocar um espaço em branco após)
  • use elseif em vez de else if.

Exemplo para mostrar a diferença entre elseif e else if:
Interpretação de elseif:

psr_image22

Interpretação de else se:

psr_image23

Para as instruções switch,

  • As chaves devem ser abertas na mesma linha onde a instrução switch é escrita.
  • O corpo do caso deve ser recuado uma vez do caso e o caso deve ser recuado uma vez da chave.
  • Não faça uma pausa quando a pausa não for necessária.
  • Você também pode usar return em vez de break.

Exemplo:

psr_image24