Uma introdução à recomendação padrão do PHP (PSR)
Publicados: 2019-12-24Era 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.

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.

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

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:


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.

- Crie um arquivo composer.json usando composer init. Caso contrário, você pode criar um manualmente agora na raiz do seu projeto.

- Configure o carregamento automático de PSR4 editando o arquivo composer.json conforme mostrado abaixo:

- 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:

Ou


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.

- Vamos primeiro criar algumas classes dentro do diretório CodeCourse.
Crie AuthFilters.php dentro de CodeCourse / Filters

Crie UserRepository.php dentro de CodeCourse / Repositories

- 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-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,

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-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.

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

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.

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

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.

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:

Interpretação de else se:

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:
