PHP: Um breve overview sobre PSR

PSR e o PHP-FIG

PSR significa PHP Standard Recommendation. Recomendações de padrões e boas práticas de desenvolvimento para PHP. Até o momento temos 5 PSR em vigor, PSR-0 até PSR-4. Exitem outras PSRs em andamento, com o status de Draft ou Review.
As PSRs são mantidas pelo pessoal do PHP-FIG. FIG significa Framework Interop Group. O FIG é composto por representantes de projetos de frameworks, CMS, etc. A finalidade é que todos os principais frameworks possam seguir os mesmos padrões de boas práticas de desenvolvimento. Alguns dos projetos que possuem representantes no FIG: Zend Framework, Laravel, PEAR, Joomla, Phalcom, Doctrine, Drupal, phpDocumentor, etc. Para uma lista completa dos membros do projeto FIG, acesse http://www.php-fig.org/.

O PHP-FIG esta fazendo um grande trabalho ao centralizar os padrões para PHP. Até então, cada projeto tinha o seu próprio padrão trabalhando de forma isolada, o que dificulta o programador ao trabalhar em diferentes projetos. O mais interessante ainda é que o os padrões definidos são públicos e podem ser adotados também em seus próprios projetos internos.

Vamos a uma breve descrição das PSRs em vigor atualmente durante a escrita deste artigo:

PSR-0: Autoloading Standard

Padrão de AutoLoad. Define a forma como os Namespaces são convertidos em caminhos de arquivo (path) para serem carregados dentro da sua aplicação. Para implementar a PSR basta programar a lógica do autoload da sua aplicação baseado na especificação. Por exemplo, caso tenha um namespace definido como Foo\Bar, em uma classe chamada XPTO, com o basedir do namespace em src/, o autoload com PSR-0 tentará carregar o arquivo da classe em src/Foo/Bar/XPTO.php.

O FIG tem um exemplo de implementação da PSR-0. A PSR-0 esta marcada como deprecated. E é recomendado utilizar a PSR-4 para novos projetos.

A PSR-0 também segue as convenções para autoload das classes do PEAR, que também é usada pelo ZF1 (Vendor_Lib_Class). (Padrão usado para versões do PHP que não tem suporte para Namespaces < 5.3).

PSR-1: Basic Coding Standard

O padrão PSR-1 foca em padrão de código básico (Basic Coding Standard):

  • Arquivos PHP devem usar somente as tags <?php e <?= .
  • Arquivos PHP devem estar na codificação UTF-8 sem BOM.
  • Declarações de classes, funções, etc. e “side-effects” (geração de output, mudanças nas configurações php.ini, etc.) devem ser mantidos separadamente.
  • Namespaces e classes devem seguir uma das PSRs de “autoloading”: [PSR-0, PSR-4].
  • Nomes de classes deve ser declaradas em StudlyCaps.
  • Constantes de classes devem ser declaradas em caixa alta usando underscore como separação.
  • Nomes de métodos devem ser declarados em camelCase.

Mais detalhes sobre a PSR-1.

PSR-2: Coding Style Guide

A PSR-2 define estilo de código a ser seguido, e é considerado uma extensão do PSR-1. Segue um Overview:

  • Código deve seguir a PSR-1: Basic Coding Standard.
  • Código deve usar 4 espaços para identação, sem utilizar tabs.
  • Não deve haver um limite máximo para o tamanho de uma linha de código. Um limite relativo para a linha deve ser de 120 caracters; Linhas deveriam ter 80 caracteres ou menos.
  • Deve haver uma linha em branco após a declaração de namespace. Deve haver também um linha em branco após o bloco de declarações “use”.
  • Abertura de chaves para classes deve ser inserida na linha abaixo da declaração, e a chave de fechamento deve ser inserido logo abaixo da última linha do corpo da classe.
  • Abertura de chaves para métodos deve ser inserida na linha abaixo da declaração, e a chave de fechamento deve ser inserido logo abaixo da última linha do corpo do método.
  • Visibilidade deve ser declarada em todas propriedades e métodos; abstract e final devem ser declaradas antes da visibilidade. static deve ser declarado após a visibilidade.
  • Palavras-chave de Estruturas de controle devem ter um espaço em branco após a mesma. Métodos e funções não.
  • Abertura de chaves para estrutura de controles deve ser inseridas na mesma linha. Chaves de fechamento devem ser inseridas após a última linha do corpo.
  • O parênteses de abertura para estrutura de controle não deve conter um espaço após ele. O parênteses de fechamento não deve conter um espaço antes dele.

Mais detalhes sobre a PSR-2.

PSR-3: Logger Interface

A PSR-3 descreve uma interface comum para bibliotecas de Log, incorporando os 8 nívels do Syslog: debug, info, notice, warning, error, critical, alert and emergency.

Os 8 níveis devem ser implementados como métodos, recebendo 2 parâmetros. A mensagem de log como string e um array opcional $context. O conteúdo do $context deve conter informação adicional que não se enquadra como string.

Clique aqui para mais detalhes sobre a PSR-3.

PSR-4: Autoloader

Esta especificação descreve como fazer o autoload das classes PHP baseado nos caminhos de arquivo do sistema. A PSR-4 pode ser utilizada no lugar da PSR-0. Porém não à substitui completamente, pois ela obriga a utilização de namespaces (>= php5.3).

A PSR-4 não força que você tenha toda a estrutura de diretório correspondente a namespace. Por exemplo, se você definir o prefixo de Namespace Acme\Foo\, ancorado em src/, a PSR-4 deve procurar a classe Acme\Foo\Bar em src/Bar.php. Para ter um resultado equivalente a PSR-0, você pode ancorar o Prefixo de Namespace Acme\Foo\ em src/Acme/Foo/.

Mais exemplos em PSR-4 / Exemplos de implementação.

Outras PSRs com status de Draft ou Review

O PHP-FIG continua trabalhando em outras especificações. Você pode obter uma lista completa de PSRs clicando aqui.

Segue abaixo as especificações que até o momento estão com status de Draft ou Review.

  • PSR-5, PHPDoc Standard (Draft): Especifica padrão de documentação para códigos PHP. Entenda um pouco mais sobre essa PSR lendo meu outro artigo Dicas para documentação de códigos PHP
  • PSR-7, Http Message Interface (Draft): Descreve interfaces comuns para representar mensagens HTTP: 1) Requisição do client para o server, 2) Resposta do servidor para o client.
  • PSR-8, Huggable Interface (Draft):
  • PSR-9, Security Diclosure (Draft): Define uma forma estruturada e comum de divulgar vulnerabilidades de segurança dos respectivos projetos.
  • PSR-6, Caching Interface (Review): Define uma interface comum para bibliotecas de cache.
Please follow and like us:

Follow

Get every new post on this blog delivered to your Inbox.

Join other followers: