Boas práticas de desenvolvimento PHP

(Última atualização em: 17 de agosto de 2016)

Quando estamos desenvolvendo nosso código PHP, ninguém nos define regras de como desenvolver. Podemos fazer como quisermos e é bom que a gente tenha essa liberdade.

Mas, na medida que nosso sistema cresce e começamos a implementá-lo em varios lugares, surge, inevitavelmente, a necessidade de seguir algum padrão para que quem vá implementar ou dar manutenção consiga entender o que está acontecendo.

Ao desenvolver um método para validar os dados de um usuário, nada nos impede de escrever algo como:

	
class Validator{public function validaUSUARIO($usuario){if($nomeValido == 
FALSE && $emailValido == FALSE && self::validaNome(
$usuario->getNome()) && self::validaEmail($usuario->getEmail()) && self::validaSenha
($usuario->getSenha())){return 
true;}else{return false;}}}

Perfeito, nosso método funciona. Mas, como funciona esse método? Quais validações ele faz? Onde começa o if e onde termina? Se alguém fosse, futuramente, dar manutenção nesse método, seria extremamente difícil!

É por isso que surgiram as PSRs (PHP Standard Recommendations). Para que haja maior interoperabilidade entre os desenvolvedores e projetos.

Uma das PSRs é a PSR 2, ou Guia de estilo de codificação (Coding Style Guide), que aborda como deve ser feita a formatação do nosso código para facilitar a leitura por outros desenvolvedores. Algumas das indicações desse guia são:

  • Devemos usar 4 espaços para identação, não tabs.
  • Não devemos fixar um numero de caracteres por linha, mas é bom que uma linha tenha menos de 80 caracteres.
  • A abertura de colchetes de classes e métodos devem vir na proxima linha.
  • A abertura de colchetes de estruturas de controle devem vir na mesma linha com um espaço em branco.

Se seguirmos a PSR 2 com nosso método, teriamos:

	
class Validator
{
    public function validaUsuario($usuario)
    {
        if (self::validaNome($usuario->getNome())
            && self::validaEmail($usuario->getEmail())
            && self::validaSenha($usuario->getSenha())) {
                return true;
        } else {
            return false;
        }
    }
}

Nosso código está muito mais legível! Conseguimos entender perfeitamente que a validação do usuario depende de 3 outros métodos validaNome, validaEmail e validaSenha e retorna um boolean. Ou seja, com PSRs conseguimos nos comunicar de forma transparente como desenvolvedores.

Mas, PSRs não servem apenas para identação de código. Quando trabalhamos com frameworks MVC é muito comum precisarmos importar arquivos. Algo como:

	
include_once "arquivo.php";

Porém conforme o sistema cresce, precisamos importar mais arquivos:

	
include_once "Namespace/SubNamespace/arquivo.php";
include_once "Namespace/SubNamespace/arquivo2.php";
include_once "Namespace/SubNamespace/arquivo3.php";
include_once "Namepsace/SubNamespace/arquivo4.php";

E a quantidade de includes tende a crescer. Esse é um dos motivos pelo qual utilizamos a funcionalidade de autoload! Existem diversas formas de se realizar autoload em php, uma delas é a PSR-4 que define uma forma padronizada de escrever nossos namespace para que possamos importar nossos arquivos da mesma forma em nossos sistemas, aumentando, também, a interoperabilidade entre projetos! Para isso, declaramos nossos namepsace com a estrutura:

	
namespace Namespace\SubNamespace;

Agora para importar nossos arquivos, a partir da versão 7 do PHP, basta utilizarmos o agrupamento do use:

	
use Namespace\SubNamespace\{arquivo1,arquivo2,arquivo3,arquivo4};

Alguns frameworks MVC estão implementando este padrão para realizar o autoload. Um exemplo é o Laravel, a partir da versão 5.

Atualmente existem 14 PSRs criadas pela PHP-FIG (Framework Interoperability Group) sendo que sete estão em desenvolvimento e cinco já foram aceitas. As PSRs aceitas, além da Coding Style Guide, são:

  • Basic Coding Standard (Padrão de código básico) – Aborda o que devemos considerar para garantir um código de alta interoperabilidade técnica com PHP.
  • Logger Interface (Interface de Logger) – Descreve uma interface comum para bibliotecas de Log.
  • Autoloading Standard (Padrão de auto-carregamento) – Descreve uma especificação para auto-carregamento de classes pelo diretório do arquivo. Também diz onde colocar arquivos que serão auto-carregados de acordo com a especificação.
  • Caching Interface (Interface de Cache) – Descreve uma interace padrão para desenvolver sistemas de Cache.
  • HTTP Message Interface (Interface de Mensagem HTTP) – Descreve uma interface padrão para desenvolvimento de mensagens HTTP .

Uma definição mais aprofundada de cada PSR, além das PSRs em desenvolvimento, está disponível no site da php-fig

Com PSRs evitamos a necessidade de nos preocupar com certas peculiaridades de cada sistema! Se um sistema segue uma PSR, ou todas, já saberemos como manipulá-lo da forma correta.

E a mesma coisa serve para os sistemas que nós desenvolvemos. Se seguirmos as PSRs, quem for implementar saberá exatamente como fazê-lo da forma correta, reservando a documentação para coisas mais específicas do sistema.

Claro que ninguém é obrigado a seguir as PSRs, ou qualquer outra especificação, ao desenvolver em PHP. É uma escolha livre do desenvolvedor, mas é necessário que, pelo menos, conheçamos bem. Afinal, a tendência é que cada vez mais projetos/frameworks sigam e, por consequência, o mercado também.

E você? Já conhecia as PSRs? O que achou? Comente aqui!

Quer conhecer as maiores novidades do php 7, além do agrupamento de use? Faça o curso PHP 7: refatorando para a nova versão.

Próximo ArtigoCriando pseudo-elementos mais rapidamente com Sass