PHP PSRs : PSR-1(Basic Coding Standard)
Tags: php, braziliandevs
Published: 2023-10-05 21:14:17

## O que são as PSRs do PHP ?

A PHP Standard Recommendation (PSR) é uma especificação PHP publicada pelo PHP Framework Interop Group, serve para a padronização de conceitos de programação em PHP.

É importante conhecer que o PHP-FIG define algumas palavras-chaves dentro das PSRs que servem como uma identificação no projeto. São elas:

- **MUST** - DEVE
- **MUST NOT** - NÃO DEVE
- **REQUIRED** - OBRIGATÓRIO
- **SHALL** - TEM QUE
- **SHALL NOT** - NÃO TEM QUE
- **SHOULD** - DEVERIA
- **SHOULD NOT** - NÃO DEVERIA
- **RECOMMENDED** - RECOMENDADO
- **MAY** - PODE
- **OPTIONAL** - OPCIONAL

## PSR-1

Essa PSR tem como objetivo definir alguns elementos padrões
de codificação que devem garantir um maior nível de
**interoperabilidade** entre os códigos PHP.

> **O QUE É INTEROPERABILIDADE ?**
Interoperabilidade é a capacidade de um sistema ou aplicação
comunicar-se com outros sistemas ou aplicações de maneira
eficiente, alcançando um maior nível de integridade dos
dados.

Garantir que a sua aplicação seja interoperável traz consigo
uma maior integridade dos dados, e além disso, a sua aplicação torna-se mais eficiente quando precisar se comunicar com outras aplicações.

Portanto, se a aplicação for interoperável, você não deverá ter dor de cabeça no momento em que precisar realizar a
comunicação com outros sistemas.

### Regras

- **Regra 1:**

Arquivos PHP **DEVEM** usar apenas as tags <?php e <?=. Em muitos servidores, as _short open tags_ estão desabilitadas por padrão e isso pode ocasionar muita dor de cabeça, então por convenção utilize somente as tags <?php ou <?=.

- **Regra 2:**

Arquivos PHP **DEVEM** usar apenas UTF-8 sem BOM (Byte Order Mark). As maiorias das IDEs já vem configurada para o padrão UTF-8 sem BOM.


- **Regra 3:**

Arquivos PHP **DEVERIAM** declarar (classes, métodos, constantes, atributos etc.) ou causar efeitos colaterais (gerar outputs, realizar modificações no php.ini etc.), mas **NÃO DEVERIAM** fazer as duas coisas.

Se seu arquivo for de declaração de uma classe ou interface,
então respeite. Faça apenas isso, nada de exibir conteúdo ou alterar configurações do php.ini antes da declaração da classe ou após a declaração.

Exemplo do que **DEVE** ser evitado:

```php
<?php
    //Alterando a configuração do php.ini
    ini_set('error_reporting', E_ALL);
    
    //Incluindo um arquivo externo
    include "arquivo.php";

    //Gerando uma saída na tela
    echo "<html>\n";

    //Declarando uma classe
    class Usuario
    {
    }
```

Agora veremos um exemplo que **DEVERIA** a ser seguido:

```php
<?php
    //Declarando uma classe
    class Usuario
    {

      private $nome;

      public function setNome($nome)
      {
        $this->nome = $nome;
      }
    }
```

- **Regra 4:**

Namespaces e classes **DEVEM** seguir o padrão descrito na
PSR-0 (depreciada) e PSR-4 (substituta da PSR-0). Para que se
obtenha um autoloading compreensível e eficaz é necessário
seguir a mesma estrutura de diretórios no namespace na
declaração dos arquivos.

> **O QUE É AUTOLOADING ?**
É a maneira de realizar o carregamento automático de arquivos como classes, interfaces, traits etc., sem que haja a necessidade de o desenvolvedor vincular esses arquivos explicitamente no código.

O autoloading de arquivos é considerado compreensível e
eficaz quando realizado da maneira correta, ou seja, da maneira que é estipulada por esta PSR.

Para entendermos melhor, vamos a um exemplo:

```
|-src
 |-App
  |-Controller
   |-HomeController.php
```

Note que temos uma estrutura de diretórios bem simples. Com
a utilização de namespace, o exemplo ficaria conforme a seguir:

```php
<?php

    namespace App\Controller;
    
    class HomeController
    {
    }
```

- **Regra 5:**

O nome de arquivos como classes, interfaces e traits **DEVEM** seguir o padrão **StudlyCaps**. Isso significa que a primeira letra de cada palavra deve ser escrita com letra maiúscula, como é o caso do nosso exemplo _HomeController_ .

- **Regra 6:**

Constantes **DEVEM** ser declaradas com todas as letras em maiúsculo e separadas por underscores (_). Nada de declarar uma constante com letras em **minúsculo**, ou **camelCase**, ou **snake_case**. O único modo permitido é a utilização de todas as letras em **maiúsculo**.

```php
<?php
    const LOG_CRITICAL = 'critical';
```

- **Regra 7:**

As propriedades definidas **DEVERÃO** ser aplicadas de forma consistente dentro de um escopo razoável, podendo ser em nível de pacote, em nível de fornecedor, de classe ou de método.

Não importa a convenção de nomenclatura utilizada (StudlyCaps, camelCase, snake_case) desde que respeitadas as regras anteriormente descritas.

- **Regra 8:**

O nome dos métodos **DEVE** ser declarado na convenção de nomenclatura camelCase.

Exemplo com a maneira correta:

```php
<?php

    public function getNomeUsuaio()
    {
    }
```

Exemplo com a maneira errada:

```php
<?php

    //Declaração em snake_case
    public function get_nome_usuario()
    {
    }

    //Declaração em StudlyCaps
    public function GetNomeUsuario()
    {
    }
```