Imagem: Tags PHP

Se você costuma trabalhar com projetos onde outros desenvolvedores também colocam a mão na massa, provavelmente já deve ter notado que cada um trabalha com um tipo de padrão de codificação PHP. Isso é normal em qualquer tipo de serviço, não só no desenvolvimento, porém, é extremamente importante estabelecer o padrão desde o início do seu projeto antes que seja tarde demais.

Quando falo em padrão de codificação, estou me referindo ao modo como os códigos são escritos, por exemplo: Utilizar tabs ou espaços? Qual o modo de quebra de linhas (EOL)? Um tab equivale a quantos espaços?

Podem parecer perguntas idiotas para alguns, mas eu mesmo já tive muitos problemas com modos de codificação diferentes em um mesmo projeto.

Vou explicar um fato que ocorreu comigo logo abaixo.

Baseado em fatos reais

Há algum tempo, trabalhei em um pequeno projeto onde éramos três desenvolvedores. Todos na mesma sala, um do lado do outro, cada um cuidando de uma parte do desenvolvimento.

Não tinha como nada dar errado, estávamos em sintonia e em constante comunicação.

Foi então que o padrão de codificação nos traiu.

Eu estava utilizando Linux (para ser mais preciso, o Ubuntu), os outros dois desenvolvedores estavam utilizando Windows e Mac, respectivamente. Cada um com um editor de textos diferente.

Meu padrão de EOLEnd-of-line (fim da linha, em português) era o <LF> ou n (padrão UNIX), do desenvolvedor que estava utilizando Mac OS também, porém, do outro desenvolvedor que estava utilizando Windows era <CR><LF> ou rn (Padrão do Windows).

Veja imagens de exemplo abaixo:

EOL convention - Unix/OSX

EOL convention - Windows

Sem ver todos os caracteres (como nas imagens acima), isso pode passar despercebido, contudo, acredite ou não, vai dar problemas posteriormente.

O Problema

O fato é que quando enviávamos os arquivos para o servidor principal (que tinha CentOS), tanto meus arquivos quanto do desenvolvedor que utilizava Mac OS, funcionavam perfeitamente, já os que estavam com o padrão EOL Windows não funcionavam de jeito nenhum.

Depois de perder um tempão tentando entender o problema, resolvi conectar ao servidor via SSH para ver como os arquivos estavam sendo lidos, e adivinha? Justamente as quebras de linhas no formato EOL Windows não funcionavam.

No PC estava tudo normal, mas quando os arquivos eram enviados ao servidor, eles simplesmente não tinham quebra de linha.

Com isso, o trecho abaixo:

<?php
	echo 'Teste';
?>

Era lido assim:

<?phpecho 'Teste';?>

Resultado? Não funcionava de jeito nenhum!

A solução

Na verdade é simples: como o desenvolvedor com Windows estava utilizando o Notepad++, bastou acessar a opção "Editar" – "EOL Convention" – "Unix / OSX Format". Depois é só salvar o arquivo e enviar ao servidor.

EOL convention - Unix/OSX

Padrão de codificação PHP: Qual utilizar?

Quem tem que estabelecer o padrão para o projeto são os desenvolvedores em conjunto, no entanto, vou passar o padrão que sigo e tento sugerir sempre que inicio um novo projeto, o padrão do Zend Framework.

São padrões já estabelecidos para que um projeto seja mantido bem organizado e todos os arquivos tenham o mesmo formato de escrita de códigos.

Vamos ver um resumo sobre o que este padrão estabelece.

Codificação padrão para o Zend Framework

Este é o padrão de codificação PHP que sigo na maioria dos meus projetos. Salvo quando a equipe estabelece outro formato.

Geral

Quando um arquivo contém apenas código PHP, não é necessário utilizar a tag de fechamento (?>).

Omitindo essa tag, você previne espaços ou quebras de linhas acidentais ao final do seu código.

Indentação

Sua indentação deve ser feita utilizando 4 espaços, não tabs.

Observação: Nesse ponto eu modifiquei um pouco o padrão, sempre utilizo tabs (que equivalem a 4 espaços).

Tamanho máximo da linha

A linha deverá ter um máximo de 80 caracteres. Claro que em alguns casos você pode passar disso, mas tente manter o padrão.

EOL Convention (Fim da linha)

Os finais de linha devem seguir o padrão UNIX, elas devem terminam com um único linefeed (LFn). Não é permitido utilizar os padrões Windows (CRLF – rn) ou Mac (CRr).

Convenções de nomes

Classes: Os nomes das classes só podem conter caracteres alfanuméricos especificados da mesma maneira em que seus diretórios são criados. Exemplo: "Raiz/Diretorio/Arquivo.php", teria o nome "Raiz_Diretorio_Arquivo".

Substitua o separador do caminho por Underlines.

A convenção também impõe que a primeira letra de cada trecho do nome da classe seja maiúscula: Exemplo_De_Nome_De_Classe.

Classes abstratas seguem o mesmo padrão das classes convencionais, no entanto, devem terminar com o nome _Abstract. Exemplo: Nome_Da_Classe_Abstract.

Nomes de arquivos e diretórios: Só podem conter caracteres alfanuméricos, underline (_) e traço (-). Exemplo: Raiz/Sub/Arquivo.php

Funções: Deve-se utilizar "camelCase" (com a letra inicial minúscula).

/* Exemplos de nomes de funções */
filterInput();
getElementById();     
widgetFactory();

Variáveis: Os nomes das variáveis ​​podem conter apenas caracteres alfanuméricos. Underlines não são permitidos. Números são permitidos, mas desencorajados na maioria dos casos.

Constantes: Constantes podem conter caracteres alfanuméricos e Underlines. Números são permitidos. Todas as letras usadas em um nome de constante devem ser maiúsculas, enquanto todas as palavras devem ser separadas por Underlines. Exemplo: EXEMPLO_DE_CONSTANTE.

Padrão para escrita de códigos PHP

Tags PHP

É recomendado que você utilize as tags PHP completas:

<?php
// Restante do código
?>

Strings comuns

Quando uma string é comum (não contém variáveis em seu valor), é recomendado o uso de aspas simples:

<?php
// Certo
$var = 'Certo';
?>

Strings com variáveis

Strings com variáveis podem ser utilizadas das seguintes maneiras:

<?php
$cumprimento = "Olá $nome!";
$cumprimento = "Olá {$nome}";
?>

Concatenação

Variáveis devem ser concatenadas com um ponto "." e espaços na direita e esquerda, exemplo:

$cumprimento = 'Olá ' . $nome;

Se você estiver concatenando vários valores, é interessante quebrar a linha antes dos 80 caracteres:

$sql = "SELECT `id`, `name` FROM `people` "
     . "WHERE `name` = 'Susan' "
     . "ORDER BY `name` ASC ";

Arrays

As chaves dos arrays devem ser separadas por uma vírgula e um espaço:

$nomes = array('josé', 'maria', 'joão');

Caso tenha várias chaves, é importante quebrar a linha e indentar os valores da segunda linha:

<?php
$nomes = array('josé', 'maria', 'joão', 'matheus', 'lucas', 
               'Fábio', 'Rosana'
);
?>

Alternativamente, você também pode indentar em apenas um nível na linha abaixo para facilitar:

<?php
$nomes = array(
	'josé'   => 'maria', 
	'joão'   => 'matheus', 
	'lucas'  => 'Fábio', 
	'Rosana' => 'Luiz',
);
?>

Também é interessante deixar uma última vírgula no último item do array, isso facilita a reordenação dos valores caso necessário.

Classes

  1. As classes devem utilizar a convenção de nomes descritas anteriormente neste artigo;
  2. A primeira abertura da chave que envolve a classe precisa estar na linha abaixo na declaração do nome da mesma;
  3. A última linha da chave que envolve a classe deve estar sozinha em uma linha;
<?php
class Exemplo_De_Classe
{
	// Faz o que deseja
}
?>

Funções

  1. As funções devem utilizar a convenção de nomes descrita anteriormente neste artigo;
  2. A primeira abertura da chave que envolve a função precisa estar na linha abaixo na declaração do nome da mesma;
  3. A última linha da chave que envolve a função deve estar sozinha em uma linha;
<?php
/**
* Documentação aqui
*/
class Foo
{
	/**
	* Outro bloco de documentação aqui
	*/
	public function bar()
	{
		// Conteúdo
	}
}
?>

Se o número de argumentos passar o limite de 80 caracteres, deve-se quebrar a linha e indentar os mesmo:

<?php
/**
* Documentação aqui
*/
class Foo
{
	/**
	* Outro bloco de documentação aqui
	*/
	public function bar( $arg1, $arg2, $arg3,
		$arg4, $arg5, $arg6 
	) {
		// Conteúdo
	}
}
?>

If / Else / Elseif

Os valores entre parênteses não devem ficar encostados no IF e na chave de abertura inicial, exemplo:

<?php
if ($a != 2) {
	// Conteúdo
}
?>

Elseif e else devem estar na mesma linha do fechamento da chave final do If.

<?php
if ($a != 2) {
	// Conteúdo
} elseif ($a != 3) {
	// Conteúdo
} else {
	// Conteúdo
}
?>

Se existirem muitas comparações, é necessário quebrar linhas e indentar as mesmas, exemplo:

<?php
if (($a == $b)
   && ($b == $c)
   || (Foo::CONST == $d)
) {
		$a = $d;
} elseif (($a != $b)
         || ($b != $c)
  ) {
		 $a = $c;
} else {
		$a = $b;
}
?>

Switch

Da mesma maneira que os condicionais descritos anteriormente, controles escritos com switch devem ter um espaço antes e depois dos parênteses:

<?php
switch ($numPeople) {
	case 1:
		break;

	case 2:
		break;

	default:
		break;
}
?>

Concluindo

´Como eu disse no início do artigo, isso não é obrigatório, mas, para evitar problemas futuros, como o que descrevi anteriormente, estabeleça um padrão antes de escrever qualquer parte do código.

Se você está participando de um projeto em andamento, procure saber qual é o padrão de codificação PHP utilizado pela equipe. Um bom exemplo disso é escrever temas e plugins para WordPress. Eles têm um padrão de escrita que deve ser seguido se você deseja se dar bem na comunidade.

Além disso, procure adotar um padrão para seus códigos, isso vai facilitar sua vida e organização.

Se você tem qualquer dúvida, dica ou sugestão, não seja egoísta, compartilhe com a gente nos comentários.