Vous êtes sur la page 1sur 37

PHP: Do Jeito Certo

1 de 37

http://br.phptherightway.com/

Do Jeito Certo.

Bem vindo

Tweetar

Existe muita informao obsoleta na Web que desnorteia novos programadores PHP, espalhando ms prticas e cdigos inseguros.
PHP: Do Jeito Certo uma referncia rpida e fcil de ler, introduzindo desenvolvedores s melhores prticas, renomados padres
de cdigo e links para tutoriais competentes pela Web.
importante entender que no existe uma maneira cannica de usar PHP. Este site introduz novos desenvolvedores PHP s
melhores prticas, opes disponveis e boas informaes, que por muitas vezes, quando descobertas, j tarde demais. Alm disso
leva o desenvolvedor a ter conceitos maduros sobre coisas que eram feitas durante anos e nunca foram reconsideradas. Esse site
no para dizer quais ferramentas voc deve utilizar, mas ao invs disso, oferecer sugestes e multiplas opes, e quando possvel
explicar as diferenas de acordo com casos de uso.
Este um documento vivo, que continuar sendo atualizado com mais informaes teis e exemplos, assim que eles estiverem
disponveis.

Tradues
PHP: Do Jeito Certo est (ou em breve estar) sendo traduzido em vrias linguagens:
Ingls
Blgaro
Chins (Simplificado)
Francs
Alemo
Lngua indonsia
Italiano
Japons
Coreano
Polons
Portugus do Brasil
Romeno
Russo
Esloveno
Espanhol
Tailands
Turco
Ucraniano

Como contribuir
Ajude a tornar este site o melhor recurso para novos programadores PHP! Contribua no GitHub

Espalhe a palavra!
PHP: Do Jeito Certo possui banners que voc pode usar em seu site. Mostre seu apoio e deixe que novos desenvolvedores PHP
saibam onde encontrar boas informaes!
Banners para divulgao

26/11/2015 13:36

PHP: Do Jeito Certo

2 de 37

http://br.phptherightway.com/

Comeando

Use a verso estvel atual (5.6)

Se voc est comeando com o PHP, certifique-se de comear com a verso estvel atual do PHP 5.6. O PHP fez grandes avanos
adicionando novas funcionalidades poderosas nos ltimos anos. No deixe que a pequena diferena entre os nmeros decimais das
verses 5.2 a 5.6 o enganem, elas representam grandes melhorias. Se voc est procurando por uma funo ou seu uso, a
documentao no php.net ter a resposta.

Servidor web embutido


Com a verso PHP 5.4+, voc pode comear a aprender PHP sem os problemas de instalar e configurar um servidor web. Para
iniciar o servidor, execute o seguinte comando no seu terminal dentro da raiz de seu projeto:
> php -S localhost:8000

Saiba mais sobre o servidor web embutido, pela linha de comando

Instalao no Mac
O OS X j vem com o PHP, mas ele normalmente um pouco atrasado em relao ltima verso estvel. O Mountain Lion vem
com a 5.3.10, o Mavericks com a 5.4.17 e o Yosemite com a 5.5.9.
Existem vrias maneiras de instalar o PHP no Mac OS X.
Homebrew um poderoso gerenciador de pacotes para OS X, que pode ajud-lo a instalar o PHP e vrias extenses facilmente.
Homebrew PHP um repositrio que contm frmulas relacionadas ao PHP para Homebrew e permite a voc instalar o PHP.
Neste ponto, voc pode instalar o php53 , php54 , php55 ou php56 usando o comando brew install e alternar entre elas
modificando a varivel PATH .

Instalar PHP via phpbrew

phpbrew uma ferramenta para instalar e gerenciar mltiplas verses do PHP. Isto pode ser realmente til se duas diferentes
aplicaes/projetos requerem diferentes verses do PHP e voc no est usando mquinas virtuais.

Compilar o cdigo fonte

Outra opo que lhe d o controle sobre a verso do PHP voc instalar, compilar o cdigo fonte. Nesse caso, certifique-se de ter
instalado o XCode ou o substituto da Apple Command Line Tools for XCode que pode ser encontrado no Apples Mac Developer
Center.

Instaladores All-in-One

As solues listadas acima lidam apenas com o PHP e no fornecem coisas como Apache, Nginx ou um servidor SQL. As solues
All-in-one como MAMP e XAMPP vo instalar estes outros programas para voc e amarr-los todos juntos, mas a facilidade de
configurao vem com o contra-ponto da flexibilidade.

Instalao no Windows
O PHP est disponvel de diversas maneiras no Windows. Voc pode baixar os binrios e at recentemente voc podia usar um
instalador .msi. O instalador no mais suportado e parou no PHP 5.3.0.
Para aprender e desenvolver localmente, voc pode utilizar o servidor web embutido do PHP 5.4+, de forma que voc no precisa se
preocupar em configur-lo. Se voc prefere um pacote completo que inclui um servidor web e MySQL, ento ferramentas como o
Web Platform Installer, o Zend Server, o XAMPP e o WAMP iro ajud-lo a montar rapidamente um ambiente de desenvolvimento
em Windows. Dito isso, estas ferramentas sero um pouco diferentes das ferramentas em produo, portanto tenha cuidado quanto
s diferenas de ambiente caso esteja trabalhando em Windows e publicando em Linux.

26/11/2015 13:36

PHP: Do Jeito Certo

3 de 37

http://br.phptherightway.com/

Caso voc precise rodar seu ambiente de produo em Windows, ento o IIS7 vai lhe dar mais estabilidade e melhor performance.
Voc pode usar o phpmanager (um plugin GUI para o IIS7) para tornar a configurao e o gerenciamento do PHP mais simples. O
IIS7 vem com o FastCGI embutido e pronto para uso, voc s precisa configurar o PHP como handler. Para suporte e mais recursos,
existe uma rea dedicada no iis.net ao PHP.

Guia de estilo de cdigo

A comunidade PHP grande e diversa, composta por inmeras bibliotecas, frameworks e componentes. comum para
desenvolvedores PHP escolher vrios destes e combin-los em um nico projeto. importante que cdigo PHP siga (o mais
prximo possvel) um estilo de cdigo comum para que desenvolvedores PHP possam misturar vrias bibliotecas em seus projetos.
O Framework Interop Group props e aprovou uma srie de recomendaes de estilo, conhecidas como PSR-0, PSR-1, PSR-2 e
PSR-4. No deixe os nomes estranhos confund-lo, estas recomendaes so meramente um conjunto de regras que projetos como
Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium etc. esto comeando a adotar. Voc pode utiliz-las para
seus prprios projetos, ou continuar utilizando seu estilo pessoal.
Idealmente voc deveria escrever cdigo PHP que adere a um ou mais destes padres. Pode ser qualquer combinao das PSRs, ou
um dos padres de cdigo feitos pela PEAR ou Zend. Isso significa que outros desenvolvedores podem facilmente ler e trabalhar no
seu cdigo, e aplicaes que implementem os componentes possam ter consistncia, mesmo trabalhando com bastante cdigo de
terceiros.
Leia sobre a PSR-0
Leia sobre a PSR-1
Leia sobre a PSR-2
Leia sobre a PSR-4
Leia sobre os Padres de Cdigo da PEAR
Leia sobre os Padres de Cdigo da Zend
Leia sobre os Padres de Cdigo do Symfony
Voc pode usar o PHP_CodeSniffer para checar seu cdigo contra qualquer uma dessas recomendaes e plugins para editores de
texto como o Sublime Text 2 para fazer a verificao em tempo real.
Voc pode corrigir o estilo do cdigo com uma das duas possveis ferramentas. Uma a PHP Coding Standards Fixer do Fabien
Potencier que tem uma base de cdigo muito bem testada. maior e mais lenta, mas muito estvel e usada por grandes projetos
como Magento e Symfony. Outra opo a php.tools, que se tornou popular pelo plugin sublime-phpfmt do sublime. Apesar de ser
mais novo ela tem grandes melhorias no desempenho fazendo com que a correo do estilo de cdigo em tempo real seja mais
fluda.
O Ingls a linguagem preferida para todos os nomes simblicos e para a infra-estrutura do cdigo. Comentrios devem ser escritos
em qualquer linguagem que possa ser facilmente lida por todos os atuais e futuros desenvolvedores que possam trabalhar nessa
base de cdigo.

Destaques da linguagem
Paradigmas de programao

O PHP uma linguagem dinmica e flexvel, que suporta uma variedade de tcnicas de programao. Ele evoluiu drasticamente
com o passar dos anos, notavelmente adicionando um slido modelo de orientao a objetos no PHP 5.0 (2004), funes annimas
e namespaces no PHP 5.3 (2009) e traits no PHP 5.4 (2012).

Programao orientada a objetos

O PHP possui um conjunto completo de funcionalidades de programao orientada a objetos, incluindo suporte classes, classes
abstratas, interfaces, herana, construtores, clonagem, excees e muito mais.
Leia sobre PHP orientado a objetos
Leia sobre Traits

Programao funcional

PHP suporta funes de primeira classe, o que significa que funes podem ser atribuidas a variveis. Tanto funes nativas como

26/11/2015 13:36

PHP: Do Jeito Certo

4 de 37

http://br.phptherightway.com/

funes definidas por usurios podem ser referenciadas por uma varivel e invocadas dinamicamente. Funes tambm pode ser
passadas como argumentos para outras funes (funcionalidade chamada de funes de ordem superior) e funes podem retornar
outras funes.
Recurso, uma funcionalidade que permite que funes realizem chamadas para elas mesmas tambm suportada pela linguagem,
mas a maioria dos cdigos em PHP tem foco em iterao.
Novas funes annimas (incluindo suporte para closures) tambm esto presentes de o PHP 5.3 (2009).
PHP 5.4 inclui a habilidade de vincular closures com o escopo de objetos e tambm melhorou o suporte para invocaveis (callables)
tanto que elas podem ser usadas indistintamente com funes annimas na maioria dos casos.
Continue lendo em Programao Funcional em PHP
Leia mais sobre Funes Annimas
Leia mais sobre Closures
Mais detalhes na RFC sobre Closures
Leia mais sobre invocveis (callables)
Leia sobre invocamento dinmico de funes com call_user_func_array

Meta Programao

PHP suporta vrias formas de meta-programao atravs de mecanismos como a API de reflexo e mtodos mgicos. Existem
vrios mtodos mgicos disponveis como __get(), __set(), __clone(), __toString(), __invoke(), etc. Isso permite que
desenvolvedores alterem o comportamento das classes. Desenvolvedores Ruby costumam dizer que o PHP carece de
method_missing , mas ele est disponvel com __call() e __callStatic().
Leia sobre Mtodos Mgicos
Leia sobre Reflexo

Namespaces
Como mencionado anteriormente, a comunidade PHP tem muitos desenvolvedores criando muito cdigo. Isso significa que o
cdigo de uma biblioteca PHP pode usar o mesmo nome de classe que uma outra biblioteca. Quando ambas bibliotecas so usadas
no mesmo namespace, elas colidem e causam problemas.
Os Namespaces resolvem esse problema. Como descrito no manual de referncia do PHP, os namespaces podem ser comparados
com os diretrios dos sistemas operacionais, que fazem namespace dos arquivos; dois arquivos com o mesmo nome podem
coexistir em diretrios separados. Da mesma forma, duas classes PHP com o mesmo nome podem coexistir em namespaces PHP
separados. Simples assim.
importante que voc use namespace no seu cdigo para que ele possa ser usado por outros desenvolvedores sem risco de coliso
com outras bibliotecas.
Um modo recomendado de usar namespaces est descrito na PSR-0, que tem como objetivo fornecer uma conveno padro para
arquivos, classes e namespaces, permitindo cdigo plug-and-play.
Em dezembro de 2013 o PHP-FIG (Framework Interop Group) criou um novo padro para carregamento automtico, a PSR-4, que
provavelmente vai substituir a PSR-0. Atualmente ambos so utilizveis, pois a PSR-4 requer o PHP 5.3 e muitos projetos que usam
apenas o PHP 5.2 ainda implementam a PSR-0. Se voc for usar um padro de carregamento automtico para uma nova aplicao
ou pacote ento quase certo que voc vai querer olhar para a PSR-4.
Nota do tradutor * Aguardando atualizao do repositrio oficial sobre o uso da PSR-0 que foi marcada como

descontinuada em 21/10/2014.

Leia sobre os Namespaces


Leia sobre a PSR-0
Leia sobre a PSR-4

Standard PHP Library


A Standard PHP Library (SPL), ou Biblioteca Padro do PHP, vem empacotada com o PHP e fornece uma coleo de classes e
interfaces. Ela composta principalmente por classes de estruturas de dados normalmente necessrias (pilha, fila, heap e outras) e

26/11/2015 13:36

PHP: Do Jeito Certo

5 de 37

http://br.phptherightway.com/

iteradores que podem percorrer por essas estruturas de dados ou por suas prprias classes que implementem as interfaces SPL.
Leia sobre a SPL

Interface de Linha de Comando


O PHP foi criado primariamente para escrever aplicaes web, mas ele tambm til para criar scripts de linha de comando (CLI).
Programas PHP de linha de comando podem te ajudar a automatizar tarefas comuns como testes, publicao e administrao de
aplicaes.
Programas PHP CLI so poderosos pois voc pode usar o cdigo de sua aplicao diretamente sem precisar criar e proteger uma
GUI (Interface Grfica do Usurio) web para isso. Apenas tenha a certeza de no colocar seus scripts PHP CLI na raiz pblica do seu
servidor web!
Tente executar o PHP a partir da sua linha de comando:
> php -i

A opo -i ir mostrar a sua configurao do PHP da mesma forma que a funo phpinfo.
A opo -a fornece um shell interativo, similar ao IRB do ruby e ao shell interativo do python. Tambm existe um nmero de
outras opes de linha comando teis.
Vamos escrever um programa CLI Hello, $name simples. Para test-lo, crie um arquivo chamado hello.php , como mostrado a
seguir.
<?php

if ($argc != 2) {

echo "Usage: php hello.php [name].\n";

exit(1);

$name = $argv[1];

echo "Hello, $name\n";

O PHP define duas variveis especiais baseadas nos argumentos que seu script receber. $argc uma varivel integer que contm a
quantidade de argumentos e $argv uma varivel array que contm o valor de cada argumento. O primeiro argumento sempre o
nome do arquivo PHP do seu programa, no caso hello.php .
A expresso exit() usada com um nmero diferente de zero para informar ao shell que o comando falhou. Cdigos de sada
normalmente usados podem ser encontrados aqui.
Para executar nosso script acima, a partir da linha de comando:
> php hello.php

Usage: php hello.php [name]


> php hello.php world
Hello, world

Aprenda sobre como executar o PHP a partir da linha de comando


Aprenda sobre como configurar o Windows para executar o PHP a partir da linha de comando

XDebug
Uma das ferramentas mais teis no desenvolvimento de software um depurador apropriado. Ele permite que voc trace a
execuo do seu cdigo e monitore os itens na pilha de execuo. XDebug, um depurador de PHP, pode ser utilizado por vrias
IDEs para prover breakpoints e inspecionar a pilha. Ele tambm lhe permite que ferramentas como PHPUnit e KCacheGrind
realizem anlise de cobertura e perfis de cdigo.

26/11/2015 13:36

PHP: Do Jeito Certo

6 de 37

http://br.phptherightway.com/

Se voc perceber que voc est travado, disposto a recorrer a var_dump/print_r, e ainda assim no consegue resolver o problema talvez voc devesse usar um depurador.
Instalar o XDebug pode ser complicado, mas uma das caractersticas mais importantes a Depurao Remota - se voc
desenvolve seu cdigo localmente e depois o testa dentro de uma VM (mquina virtual) ou em outro servidor, a Depurao
Remota uma caracterstica que voc vai querer manter ativa desde o incio.
Tradicionalmente, voc modificar o VHost ou o .htaccess do seu Apache para incluir os seguintes valores:
php_value xdebug.remote_host=192.168.?.?
php_value xdebug.remote_port=9000

O remote host e o remote port vo corresponder ao seu computador local e a porta que voc configurar para ser escutada na sua
IDE. apenas uma questo de colocar a sua IDE em modo para escutar por conexes, e carregar a URL:
http://your-website.example.com/index.php?XDEBUG_SESSION_START=1

Sua IDE agora ir interceptar o estado atual enquanto seu script executado, permitindo a voc definir breakpoints e inspecionar
os valores na memria.
Depuradores grficos deixam muito fcil o processo de percorrer o cdigo, inspecionar variveis e avaliar o cdigo em tempo de
execuo. Vrias IDEs possuem incluso ou suportam um plugin para depurar graficamente com o XDebug. MacGDBp gratuito
tem o cdigo fonte aberto uma GUI (Interface Grfica do Usurio) stand-alone do XDebug para Mac.
Aprenda sobre o XDebug
Aprenda sobre o MacGDBp

Gerenciamento de Dependncia
Existem toneladas de bibliotecas PHP, frameworks, e componentes para voc escolher. Seu projeto provavelmente ir usar muitos
deles eles so as dependncias do projeto. At recentemente, o PHP no possua uma boa forma de gerenciar essas dependncias
de projeto. Mesmo se voc as gerenciasse manualmente, ainda assim teria que se preocupar com autoloaders. No mais.
Atualmente existem dois sistemas principais para gerenciamento de pacotes no PHP - o Composer e o PEAR. Qual deles o certo
para voc? A resposta : ambos.
Use o Composer quando estiver gerenciando as dependncias de um nico projeto.
Use o PEAR quando gerenciar dependncias do PHP para o seu sistema inteiro.
Em geral, os pacotes Composer estaro disponveis apenas em projetos que voc especificar de forma explcita, enquanto que um
pacote PEAR estar disponvel para todos os seus projetos PHP. Mesmo que o PEAR parea ser o mtodo mais fcil primeira
vista, existem vantagens em usar uma abordagem projeto-por-projeto para suas dependncias.

Composer e Packagist
O Composer um gerenciador de dependncias brilhante para o PHP. Liste as dependncias do seu projeto em um arquivo
composer.json e, com poucos comandos simples, o Composer ir fazer o download das dependncias do seu projeto
automaticamente e configurar o autoloading para voc.
J existem vrias bibliotecas PHP que so compatveis com o Composer, prontas para usar no seu projeto. Esses pacotes esto
listados no Packagist, o repositrio oficial das bibliotecas PHP compatveis com o Composer.

Como Instalar o Composer

Voc pode instalar o Composer localmente (no seu diretrio de trabalho atual; embora isso no seja o mais recomendado) ou
globalmente (e.g. /usr/local/bin). Vamos assumir que voc queira instalar o Composer localmente. A partir do diretrio raiz do seu
projeto:
curl -s https://getcomposer.org/installer | php

26/11/2015 13:36

PHP: Do Jeito Certo

7 de 37

http://br.phptherightway.com/

Isso ir baixar o composer.phar (um arquivo PHP binrio). Voc pode execut-lo com o php para gerenciar as dependncias do
seu projeto. Por favor, Observe: Se voc passar o cdigo baixado diretamente para um interpretador, por favor leia primeiro o
cdigo online para confirmar que ele seguro.

Para usurios Windows a forma mais fcil de obter e execut-lo usar o instalador ComposerSetup, que realiza uma instalao
global e configura seu $PATH de modo que voc possa executar o comando composer em qualquer diretrio pela linha de
comando.

Como instalar o Composer (manualmente)

Instalar o Composer manualmente uma tcnica avanada; no entanto, existem vrias razes pelas quais um desenvolvedor
poderia preferir esse mtodo a usar a rotina de instalao interativa. A instalao interativa verifica sua instalao do PHP para
garantir que:
uma verso suficiente do PHP esteja sendo usada
arquivos .phar possam ser executados corretamente
permisses em certos diretrios sejam suficientes
certas extenses problemticas no estejam carregadas
certas configuraes no php.ini no estejam definidas
Como uma instalao manual no executa nenhuma dessas verificaes, voc precisa decidir se o custo valer a pena para voc. Se
sim, segue abaixo como obter o Composer manualmente:
curl -s https://getcomposer.org/composer.phar -o $HOME/local/bin/composer
chmod +x $HOME/local/bin/composer

O caminho $HOME/local/bin (ou um diretrio de sua escolha) deve estar na sua varivel de ambiente $PATH . Isso far com que o
comando composer fique disponvel.
Quando voc vir a documentao dizendo para executar o Composer como php composer.phar install , voc pode substituir por
isso:
composer install

Esta seo assumir que voc tem globalmente instalado o composer.

Como Definir e Instalar Dependncias

O Composer mantm o controle de dependncias do seu projeto em um arquivo chamado composer.json . Voc pode control-lo
na mo se preferir ou usar o prprio Composer. O comando composer require adiciona uma dependncia do projeto e se voc
no tem um arquivo composer.json , ele ser criado. Aqui est um exemplo que adiciona o Twig como uma dependncia do seu
projeto.
composer require twig/twig:~1.8

Outra alternativa o comando composer init que guiar a criao completa do arquivo composer.json para seu projeto. De
qualquer maneira, uma vez criado o arquivo composer.json voc pode chamar o Composer para baixar suas dependncias para o
diretrio vendor/ . Isto tambm se aplica para projetos baixados que fornecem um arquivo composer.json :
composer install

Em seguida, adicione esta linha ao arquivo PHP principal da sua aplicao; isso dir ao PHP para usar o autoloader do Composer
para as dependncias do seu projeto.
<?php

require 'vendor/autoload.php';

26/11/2015 13:36

PHP: Do Jeito Certo

8 de 37

http://br.phptherightway.com/

Agora voc pode usar as dependncias do seu projeto, e elas sero carregadas automaticamente sob demanda.

Atualizando suas dependncias

O Composer cria um arquivo chamado composer.lock que armazena a verso exata de cada pacote baixado quando voc executou
php composer.phar install . Se voc compartilhar seu projeto com outros desenvolvedores e o arquivo composer.lock parte
da sua distribuio, quando executarem php composer.phar install eles recebero as mesmas verses como voc. Para atualizar
suas dependncias, execute php composer.phar update . Isso muito til quando voc define as verses requiridas. Por exemplo,
a verso requerida de ~1.8 significa qualquer verso mais recente que 1.8.0 , mas menos recente do que 2.0.x-dev . Voc
tambm pode usar o curinga * como 1.8.* . Agora o comando php composer.phar update do Composer atualizar todas as
suas dependncias para a verso mais recente que se encaixa s restries definidas.

Notificaes de Atualizao

Para receber notificaes sobre novas verses voc pode se inscrever no VersionEye, um servio web que pode monitorar sua conta
GitHub e BitBucket para arquivos composer.json e envia emails com as novas verses do pacote.

Verificando suas dependncias para as questes de segurana

O Security Advisories Checker um servio web e uma ferramenta de linha de comando, ambos examinaro seu arquivo
composer.lock e diro se voc precisa atualizar alguma das dependncias.
Aprenda sobre o Composer

PEAR
Outro gerenciador de pacotes veterano e que muitos desenvolvedores PHP gostam o PEAR. Ele se comporta da mesma maneira
que o Composer, mas possui diferenas notveis.
PEAR requer que cada pacote tenha uma estrutura especfica, isso significa que o autor do pacote deve prepar-lo para ser usado
com PEAR. No possvel usar um projeto que no foi preparado para o PEAR.
PEAR instala pacotes de forma global, ou seja, uma vez instalados ficam disponveis para todos os projetos no servidor. Isto pode
ser bom se muitos projetos dependem dos mesmos pacotes com as mesmas verses, mas isso pode gerar problemas se houver
conflitos de verses entre os projetos.

Como instalar o PEAR

Voc pode instalar o PEAR baixando o instalador phar e executando-o. A documentao do PEAR tem instrues de instalao mais
detalhadas para todos sistemas operacionais.
Se voc usa Linux, pode conferir no gerenciador de pacotes da sua distribuio. Debian e Ubuntu, por exemplo, tem um pacote
php-pear .

Como instalar um pacote

Se o pacote est na lista de pacotes do PEAR, voc pode instal-lo informando seu nome oficial:
pear install foo

Se o pacote est hospedado em outro canal, voc precisa, primeiro, descobr-lo ( discover ) e especific-lo durante a instalao.
Veja a Documentao Usando Canais para mais informaes sobre este tpico.
Aprenda sobre PEAR

Manuseio de dependncias PEAR com Composer

Se voc j est usando Composer e tambm gostaria de instalar algum cdigo PEAR, voc pode usar o Composer para manusear
suas dependncias PEAR. Este exemplo instalar um cdigo a partir do pear2.php.net :
{

26/11/2015 13:36

PHP: Do Jeito Certo

9 de 37

http://br.phptherightway.com/
"repositories": [
{

],

"type": "pear",

"url": "http://pear2.php.net"

"require": {

"pear-pear2/PEAR2_Text_Markdown": "*",

"pear-pear2/PEAR2_HTTP_Request": "*"

A primeira seo "repositories" ser usada para o Composer saber que deve inicializar (ou descobrir a terminologia PEAR)
o repositrio pear. Em seguida, na seo "require" ter pear como prefixo no nome do pacote, como:

pear-channel/Package
O prefixo pear padro para evitar qualquer conflito, por exemplo, um canal pear pode ter o mesmo nome de um pacote no
vendor. Ento, o nome curto do canal (ou a URL completa) pode ser usada para referenciar o canal em que o pacote se encontra.
Quando este cdigo for instalado, ficar disponvel dentro do seu diretrio vendor e disponvel automaticamente atravs do
autoloader do Composer:

vendor/pear-pear2.php.net/PEAR2_HTTP_Request/pear2/HTTP/Request.php
Para usar este pacote PEAR, basta referenci-lo assim:
<?php

$request = new pear2\HTTP\Request();

Aprenda mais sobre o uso do PEAR com Composer

Prticas de Codificao
O Bsico

PHP uma grande linguagem que permite a programadores de todos os nveis produzirem cdigo, no apenas rapidamente, mas
eficientemente. Entretando enquanto se avana na linguagem, ns frequentemente esquecemos do bsico que tinhamos aprendido
no comeo (ou passado o olho) em prol de atalhos e/ou maus hbitos. Para ajudar a combater esse problema comum, esse seo
focada em lembrar aos programadores das prticas bsicas de codificao no PHP.
Continue lendo O Bsico

Data e Horrio
O PHP tem uma classe chamada DateTime para ajudar voc com leitura, escrita, comparaes e clculos com datas e horrios.
Existem muitas funes no PHP relacionadas a datas e horrios alm da DateTime, mas ela fornece uma boa interface orientada a
objetos para a maioria dos usos comuns. Ela pode tratar de fusos horrios, mas isso vai alm dessa breve introduo.
Para comear a trabalhar com a DateTime, converta uma string bruta de data e hora para um objeto com o mtodo factory
createFromFormat() , ou use new DateTime para obter a data e a hora atual. Use o mtodo format() para converter um objeto
DateTime de volta para uma string para sada.
<?php

$raw = '22. 11. 1968';

$start = DateTime::createFromFormat('d. m. Y', $raw);


echo "Start date: " . $start->format('Y-m-d') . "\n";

26/11/2015 13:36

PHP: Do Jeito Certo

10 de 37

http://br.phptherightway.com/

Clculos com a DateTime so possveis com a classe DateInterval. A DateTime tem mtodos como o add() e o sub() que
recebem um DateInterval como argumento. No escreva cdigo que espera o mesmo nmero de segundos para todos os dia, pois
tanto as alteraes de horrio de vero quanto as de fuso horrio iro quebrar essa suposio. Em vez disso use intervalos de data.
Para calcular diferenas entre datas use o mtodo diff() . Ele retornar um novo DateInterval, que bem fcil de mostrar.
<?php

// cria uma cpia de $start e adiciona um ms e 6 dias


$end = clone $start;

$end->add(new DateInterval('P1M6D'));
$diff = $end->diff($start);

echo "Difference: " . $diff->format('%m month, %d days (total: %a days)') . "\n";


// Diferena: 1 ms, 6 dias (total: 37 dias)

Com objetos DateTime, voc pode usar a comparao padro:


<?php

if($start < $end) {


}

echo "Start is before end!\n";

Um ltimo exemplo para demonstrar a classe DatePeriod. Ela usada para iterar por eventos recorrentes. Ela pode receber dois
objetos DateTime, um incio e um fim, e o intervalo para o qual ele retornar todos os eventos intermedirios.
<?php

// mostra todas as quintas-feiras entre $start e $end

$periodInterval = DateInterval::createFromDateString('first thursday');

$periodIterator = new DatePeriod($start, $periodInterval, $end, DatePeriod::EXCLUDE_START_DATE);


foreach($periodIterator as $date) {
//mostra cada data no perodo

echo $date->format('Y-m-d') . " ";

Leia sobre a classe DateTime


Leia sobre formatao de datas (opes aceitas para formatos de strings de data)

Design Patterns
Quando voc est construindo sua aplicao web muito til utilizar padres de codificao para formar a estrutura do seu projeto.
Usar design patterns (padres de projeto) til pois eles facilitam bastante na hora de gerenciar seu cdigo e permite que outros
desenvolvedores entendam rapidamente como tudo est se encaixando.
Se voc utiliza um framework ento a maior parte do cdigo de alto nvel e a estrutura do projeto sero baseados no framework, ou
seja, uma grande parte das decises de padres de design do cdigo j foram decididas para voc. Mas ainda cabe a voc escolher os
melhores padres a seguir no cdigo na hora de utiliz-los no framework. Se, por outro lado, voc no estiver utilizando uma
framework para construir sua aplicao, ento voc ter que descobrir os padres que melhor se encaixam para o tipo e tamanho da
aplicao que voc est construindo.
Continue lendo em Design Patterns

Trabalhando com UTF-8


Esta seo foi originalmente escrita por Alex Cabal como PHP Melhores Prticas e tem sido usado como base para os nossos
prprios conselhos sobre UTF-8.

No existe um jeito fcil. Seja cuidadoso, detalhado e consistente.

Atualmente o PHP no possui suporte a Unicode em um nvel baixo. Existem maneiras de garantir que strings UTF-8 sejam
processadas OK, mas no fcil e isto requer cavar quase todos os nveis da aplicao web desde o HTML passando pelo SQL, at o

26/11/2015 13:36

PHP: Do Jeito Certo

11 de 37

http://br.phptherightway.com/

PHP. Vamos abordar para um resumo reve e prtico.

UTF-8 no nvel do PHP

As operaes bsicas com strings, como concatenar duas strings e atribuio de strings a variveis, no preciso de nada especial
para o UTF-8. No entanto a maioria das funes de strings, como strpos() e strlen() , precisam de ateno especial. Essas
funes tm, frequentemente, uma mb_* em contrapartida: por exemplo mb_strpos() e mb_strlen() . Estas funes de string
mb_* so disponibilizados a voc por meio do Multibyte Extenso String e so projetadas especificamente para operar em strings
de caracteres Unicode.
Voc deve usar as funes mb_* sempre que operar com strings Unicode. Por exemplo, se voc usar substr() em uma string
UTF-8, h uma boa chance de que o resultado ter alguns caracteres ilegveis. A funo correta de usar seria a contrapartida
multibyte, mb_substr() .
A parte mais difcil lembrar de usar as funes mb_* em todos os momentos. Se voc esquecer mesmo que apenas uma vez, sua
string Unicode tem uma chance de ser ilegvel durante o processamento.
Nem todas as funes de string tm um mb_*` contrapartida. Se no houver uma para o que voc quer fazer, ento voc pode estar
sem sorte.
Voc deve usar a funo mb_internal_encoding() no topo de cada script PHP que voc escreve (ou no topo de seu script global
que seja includo), e a funo mb_http_output() logo aps ele se seu script est enviando sada para um navegador. Definir
explicitamente a codificao de suas strings em cada script vai lhe poupar muita dor de cabea futuramente.
Alm disso, muitas funes PHP que operam em cadeias de caracteres tm um parmetro opcional que lhe permite especificar o
caractere codificao. Voc deve sempre indicar explicitamente UTF-8 quando for dada a opo. Por exemplo, htmlentities()
tem uma opo para codificao de caracteres, e voc deve sempre especificar UTF-8 se lidar com tais cordas. Note-se que a partir
do PHP 5.4.0, UTF-8 a codificao padro para htmlentities() e htmlspecialchars() .
Finalmente, se voc estiver criando um aplicativo distribudo e no tiver certeza de que a extenso mbstring ser ativada, ento
considere o uso do pacote Composer patchwork/utf8. Isto ir usar a mbstring se estiver disponvel, e criar fall back para funes
UTF-8 que no estiverem.

UTF-8 no nvel de banco de dados

Se o seu script PHP acessa o MySQL, h uma chance de suas strings serem armazenadas como strings no-UTF-8 no banco de
dados, mesmo que voc siga todas as precaues acima.
Para certificar-se de que suas strings iro do PHP para o MySQL como UTF-8, verifique se o banco de dados e as tabelas esto todos
setados com o character set e o collation como utf8mb4 e que voc use o character set utf8mb4 na string de conexo PDO. Veja o
exemplo de cdigo abaixo. Isto criticamente importante.
Observe que voc deve usar o character set utf8mb4 para ter suporte completo de UTF-8 e no o character set utf8 ! Continue
lendo para o porqu.

UTF-8 no nvel do navegador

Use a funo mb_http_output() para garantir que o seu script PHP gere strings UTF-8 para o seu browser.
O navegador ento ser avisado pela resposta HTTP que esta pgina deve ser considerada como UTF-8. A abordagem histrica para
fazer isso foi a incluso da tag <meta> charset na tag <head> da sua pgina. Esta abordagem perfeitamente vlida, mas definir o
charset no cabealho Content-type realmente muito mais rpido.
<?php

// Diz para o PHP que estamos usando strings UTF-8 at o final do script
mb_internal_encoding('UTF-8');

// Diz para o PHP que ns vamos enviar uma sada UTF-8 para o navegador
mb_http_output('UTF-8');

// A nossa string UTF-8 de teste

$string = 'l sla erin l e-govaned vn.';

26/11/2015 13:36

PHP: Do Jeito Certo

12 de 37

http://br.phptherightway.com/

// Transformar a seqncia de alguma forma com uma funo multibyte

// Observe como cortamos a string em um caractere no-ASCII para fins de demonstrao


$string = mb_substr($string, 0, 15);

// Conectar a um banco de dados para armazenar a string transformada


// Veja o exemplo PDO neste documento para obter mais informaes
// Observe os comandos `set names utf8mb4`!
$link = new PDO(

'mysql:host=your-hostname;dbname=your-db;charset=utf8mb4',
'your-username',
'your-password',
array(

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,

);

PDO::ATTR_PERSISTENT => false

// Armazena a nossa string transformada como UTF-8 em nosso banco de dados


// Seu DB e tabelas esto com character set e collation utf8mb4, certo?

$handle = $link->prepare('insert into ElvishSentences (Id, Body) values (?, ?)');


$handle->bindValue(1, 1, PDO::PARAM_INT);
$handle->bindValue(2, $string);
$handle->execute();

// Recuperar a string que armazenamos apenas para provar se foi armazenada corretamente
$handle = $link->prepare('select * from ElvishSentences where Id = ?');
$handle->bindValue(1, 1, PDO::PARAM_INT);
$handle->execute();

// Armazena o resultado em um objeto que vamos sada mais tarde em nossa HTML
$result = $handle->fetchAll(PDO::FETCH_OBJ);

header('Content-Type: text/html; charset=UTF-8');


?><!doctype html>
<html>

<head>

<meta charset="UTF-8">

<title>UTF-8 test page</title>

</head>
<body>

<?php

foreach($result as $row){
}

print($row->Body);

// Isto deve emitir corretamente nossa string transformada como UTF-8 para o navegador

?>

</body>

</html>

Leitura adicional

Manual do PHP: Operaes Strings


Manual do PHP: Funes para Strings
strpos()
strlen()
substr()

Manual do PHP: Funes multibyte de strings


mb_strpos()
mb_strlen()
mb_substr()

mb_internal_encoding()
mb_http_output()
htmlentities()

26/11/2015 13:36

PHP: Do Jeito Certo

13 de 37

http://br.phptherightway.com/
htmlspecialchars()

Dicas PHP e UTF-8


Manuseando UTF-8 com o PHP
Stack Overflow: Quais os fatores que fazem o PHP incompatvel com Unicode?
Stack Overflow: Melhores prticas em PHP e MySQL com strings internacionais
Como ter suporte total a Unicode em bases de dados MySQL
Trazendo Unicode para o PHP com Portable UTF-8

Dependency Injection (Injeo de


Dependncia)
Fonte Wikipedia:

Dependency Injection um Design Pattern que permite retirar as dependncias hard-coded e torna
possvel mud-las, seja em tempo de execuo ou em tempo de compilao.
Esta citao torna o conceito muito mais complicado do que realmente . Dependency Injection fornece um componente com suas
dependncias, seja por injeo no construtor, chamada de mtodo ou na definio de propriedades. simples assim.

Conceito Bsico
Demostraremos o conceito com um simples exemplo.
Temos uma classe Database que requer um adaptador para se comunicar com o banco de dados. Instanciaremos o adaptador no
construtor e assim criamos uma forte de dependncia. Isto dificulta os testes e significa que a classe Database est fortemente
acoplada ao adaptador.
<?php

namespace Database;
class Database
{

protected $adapter;
public function __construct()
{

$this->adapter = new MySqlAdapter;

class MysqlAdapter {}

Este cdigo pode ser refatorado para usar a Dependency Injection para desacoplar a dependncia.
<?php

namespace Database;
class Database
{

protected $adapter;
public function __construct(MySqlAdapter $adapter)
{

$this->adapter = $adapter;

class MysqlAdapter {}

26/11/2015 13:36

PHP: Do Jeito Certo

14 de 37

http://br.phptherightway.com/

Agora, damos a classe Database a sua dependncia em vez de criar dentro dela. Poderiamos tambm, criar um mtodo que
aceitaria um argumento da dependncia e defini-la dessa forma, ou definir a propriedade $adapter como public para defini-la
diretamente.

Problema Complexo
Se voc j leu sobre Inverso de Dependncia, ento voc provavelmente viu os termos Inverso de Controle ou Princpio da
Inverso de Dependncia. Estes so os problemas complexos que a Inverso de Dependncia resolve.

Inverso de Controle

Inverso de controle como se diz, invertendo o controle de um sistema para manter os controles organizacionais totalmente
separados dos seus objetos. Em termos de Dependency Injection, isto significa desacoplar as dependncias para control-las e
instanci-las em outro lugar do sistema.
Por anos, os frameworks PHP usam a Inverso de Controle, no entanto, a questo : que parte do controle est invertendo, e onde?
Por exemplo, frameworks MVC, em geral, fornecem um super objeto ou um controlador base que outros controladores devem
extender para obter acesso as suas dependncias. Isto Inverso de Controle, no entanto, em vez de desacoplar as dependncias,
este mtodo simplesmente as mudou.
Dependency Injection permite resolver de forma mais elegante este problema apenas injetando a dependncia que precisamos,
quando precisamos dela, sem a necessidade de quaisquer dependncias no cdigo.

Princpio da Inverso de Dependncia

O Princpio da Inverso de Dependncia o D, no S.O.L.I.D, define o princpio de design da orientao a objeto que afirma que
Dependa de uma Abstrao. No depende de Objetos concretos. Simplificando, isto significa que nossas dependncias devem ser
classes de interfaces/contratos ou class abstratas em vez de implementaes concretas. Podemos facilmente refatorar o exemplo
abaixo para seguir este princpio.
<?php

namespace Database;
class Database
{

protected $adapter;
public function __construct(AdapterInterface $adapter)
{

$this->adapter = $adapter;

interface AdapterInterface {}
class MysqlAdapter implements AdapterInterface {}

Existem vrios benefcios para a classe Database , agora, dependendo de uma interface em vez de um objeto concreto.
Considerando que voc trabalha em uma equipe e o adaptador est sendo trabalhado por um colega. No primeiro exemplo,
teriamos que esperar o colega dizer que terminou o adaptador antes que pudssemos simul-la(mock) nos testes unitrios. Agora,
que a denpendncia uma interface/contrato podemos facilmente simul-la(mock) sabendo que o colega vai construir o adaptador
com base neste contrato.
Um benefcio ainda maior para este mtodo que nosso cdigo, agora, est mais escalvel. Se um ano depois decidir migrar para
um banco de dados diferente, podemos escrever um novo adaptador que implementa a interface original e injet-lo, no seria
preciso nenhuma refatorao, pois o adaptador segue o contrato definido pela interface.

Containers
A primeira coisa que voc deve entender sobre os Containers da Dependency Injection que eles no so a mesma coisa que ela.

26/11/2015 13:36

PHP: Do Jeito Certo

15 de 37

http://br.phptherightway.com/

Um container um utilitrio de convenincia que nos ajuda implementar a Dedepency Injection, no entanto, eles podem ser, e
muitas vezes so, uma implementao anti-pattern, Service Location (Servio de Localizao). Injetar um container DI como um
Localizador de Servio para suas classes, sem dvida, cria uma dependncia difcil de substituir no container. Isso tambm torna
seu cdigo menos transparente e, finalmente, mais difcil de testar.
A maioria dos frameworks tm seu prprio Container de Dependency Injection que permite ligar suas dependncias em conjunto,
atravs de configurao. O que isto significa, na prtica, que voc pode escrever o cdigo da aplicao to limpo e desacoplado como
do framework foi construdo.

Leitura Adicional
Aprenda sobre Dependency Injection e PHP
O que Dependency Injection?
Dependency Injection: uma analogia
Dependency Injection: Huh?
Dependency Injection como uma ferramenta para testes

Bancos de Dados

Muitas vezes o seu cdigo PHP usar um banco de dados para persistir informaes. Voc tem algumas opes para conectar e
interagir com o seu banco de dados. A opo recomendada at o PHP 5.1.0 era usar os drivers nativos, como o mysqli, o pgsql,
mssql etc.
Drivers nativos so excelentes se voc estiver usando apenas um banco de dados em sua aplicao, mas se, por exemplo, voc
estiver usando o MySQL e um pouco de MSSQL, ou voc precisar conectar em um banco de dados Oracle, a voc no poder usar
os mesmos drivers. Voc precisar aprender um API totalmente nova para cada um dos bancos de dados e isso pode ficar chato.

MySQL Extension
A extenso mysql para o PHP no est mais em desenvolvimento ativo e foi oficialmente descontinuada no PHP 5.5.0. Isso significa
que ela ser removida dentro de alguns lanamentos das prximas verses. Se voc estiver usando funes que inicial com
mysql_* como a mysql_connect() e a mysql_query() em suas aplicaes voc ir se deparar com uma reescrita em algum
momento no futuro, por isso a melhor opo substituir o uso do mysql pelo mysqli ou pela PDO na sua aplicao dentro de sua
prpria agenda de desenvolvimento, assim voc no ter que correr l na frente.
Se voc estiver comeando do zero ento no utilize de forma nenhuma a extenso mysql: use a extenso
MySQLi, ou use a PDO.
PHP: Choosing an API for MySQL
PDO Tutorial for MySQL Developers

Extenso PDO
A PDO uma biblioteca para abstrao de conexes a bancos de dados embutida no PHP desde a verso 5.1.0 que fornece uma
interface comum para conversar com vrios bancos de dados diferentes. Por exemplo, voc pode usar basicamente o mesmo cdigo
para fazer a interface com o MySQL ou SQLite:
<?php

// PDO + MySQL

$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');


$statement = $pdo->query("SELECT some\_field FROM some\_table");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['some_field']);
// PDO + SQLite

$pdo = new PDO('sqlite:/path/db/foo.sqlite');

$statement = $pdo->query("SELECT some\_field FROM some\_table");


$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['some_field']);

26/11/2015 13:36

PHP: Do Jeito Certo

16 de 37

http://br.phptherightway.com/

A PDO no ir traduzir suas consultas SQL ou emular funcionalidades que no existem; ela feita puramente para conectar
mltiplos tipos de bancos de dados com a mesma API.
Mais importante, a PDO permite que voc injete de forma segura entradas externas (e.g IDs) em suas consultas SQL sem se
preocupar com ataques de SQL injection. Isso possvel usando instrues PDO (PDO statements) e parmetros restritos (bound
parameters).
Vamos assumir que um script PHP recebe um ID numrico como parmetro de uma consulta. Este ID deve ser usado para buscar
um registro de um usurio no banco de dados. Essa a forma errada de fazer isso:
<?php

$pdo = new PDO('sqlite:/path/db/users.db');

$pdo->query("SELECT name FROM users WHERE id = " . $_GET['id']); // <-- NO!

Esse cdigo pssimo. Voc est inserindo um parmetro bruto na sua consulta SQL. Isso far voc ser hackeado num piscar de
olhos, usando uma prtica chamada SQL Injection. Apenas imagine se um hacker passar como parmetro um id inventivo
chamando uma URL como http://domain.com/?id=1%3BDELETE+FROM+users . Isso ir definir a varivel $_GET['id'] como
id=1;DELETE FROM users , o que ir excluir todos os seus usurios. Em vez disso, voc deveria higienizar (sanitize) a entrada do ID
usando parmetros restritos da PDO.
<?php

$pdo = new PDO('sqlite:/path/db/users.db');

$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');

$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); //<-- Higienizado automaticamente pela PDO


$stmt->execute();

Esse o cdigo correto. Ele usa um parmetro restrito em uma instruo PDO. Assim a entrada externa do ID escapada antes de
ser introduzida no banco de dados, prevenindo contra potenciais ataques de SQL injection.
Leia mais sobre a PDO
Voc tambm deve estar ciente de que usam recursos do servidor e no raro ter esses recursos esgotados se essas conexes no
forem implicitamente fechadas, entretanto isso mais comum em outras linguagens. Com PDO voc pode implicitamente fechar as
conexes pela destruio dos objetos garantindo que todas as referncias a ele forem excludas, ex. atribuindo NULL a elas. Se voc
no fizer isso explicitamente o PHP ir fechar todas as conexes quando seu script terminar - a no ser claro que voc esteja
usando conexes persistentes.
Leia mais sobre conexes PDO

Interagindo com o banco de dados


Quando os desenvolvedores comeam a aprender PHP, muitas vezes acabam misturando a interao com o banco de dados com a
camada de apresentao, usando cdigo que pode parecer com isso:
<ul>

<?php

foreach ($db->query('SELECT * FROM table') as $row) {


}

echo "<li>".$row['field1']." - ".$row['field1']."</li>";

?>

</ul>

Esta uma m prtica por vrias razes, principalmente por ser difcil de depurar, testar, ler e ainda pode gerar na sada um monte
de campos se no houver um limite.
Embora existam muitas outras solues para fazer isso - dependendo se voc preferir a OOP ou programao funcional - deve haver
algum elemento de separao.
Considere o passo mais bsico:

26/11/2015 13:36

PHP: Do Jeito Certo

17 de 37

http://br.phptherightway.com/

<?php

function getAllFoos($db) {
}

return $db->query('SELECT * FROM table');

foreach (getAllFoos($db) as $row) {


}

echo "<li>".$row['field1']." - ".$row['field1']."</li>"; // BAD!!

Este um bom comeo. Coloque estes dois itens em dois arquivos diferentes e voc ter alguma separao limpa.
Crie uma classe para colocar este mtodo e voc ter um Modelo. Criando um arquivo .php simples para colocar a lgica de
apresentao e voc ter uma View, que quase um MVC - uma arquitura OOP comum para a maioria dos frameworks.
foo.php
<?php

$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');


// Deixe seu modelo disponvel

include 'models/FooModel.php';
// Crie uma instncia

$fooList = new FooModel($db);


// Mostre a view

include 'views/foo-list.php';

models/FooModel.php
<?php

class Foo()
{

protected $db;
public function __construct(PDO $db)
{
}

$this->db = $db;

public function getAllFoos() {


}

return $this->db->query('SELECT * FROM table');

views/foo-list.php
<?php foreach ($fooList as $row): ?>

<?= $row['field1'] ?> - <?= $row['field1'] ?>

<?php endforeach ?>

Isto essenciamente o mesmo que a maioria dos frameworks modernos fazem, todos sejam eles um pouco mais manual. Voc pode
no precisar de tudo a todo momento, mas misturando muita lgica de apresentao e interao com o banco de dados pode ser um
problema real se voc quiser testes unitrios em sua aplicao.
PHPBridge tem um grande recurso chamado Criando uma classe de dados que aborda um tpico muito similar e timo para os
desenvolvedores se acostumar ao o conceito de interagir com o banco de dados.

Camadas de Abstrao
26/11/2015 13:36

PHP: Do Jeito Certo

18 de 37

http://br.phptherightway.com/

Muitos frameworks fornecem sua prpria camada de abstrao que pode ou no sobrepor o PDO. Estes muitas vezes simulam
caractersticas de um sistema de banco de dados que outro banco de dados no possui envolvendo suas consultas em mtodos PHP,
dando-lhe a abstrao real do banco de dados em vez de apenas a abstrao da conexo como o PDO oferece.
Isto obviamente adiciona um pequeno peso, mas se voc estiver construindo uma aplicao porttil que precise trabalhar com
MySQL, PostgreSQL e SQLite, ento este pequeno peso vai valer a pena pela limpeza e menos linhas de cdigo.
Algumas camadas de abstrao foram construdas utilizando o padro de namespaces da PSR-0 ou PSR-4 para que possa ser
instalado em qualquer aplicao que voc queira.
Aura SQL
Doctrine2 DBAL
Propel
ZF2 Db

Templates
Os templates fornecem uma forma conveniente de separar seu controlador e a camada de domnio da sua camada de apresentao.
Eles contm geralmente o HTML de sua aplicao, mas tambm podem ser usados para outros formatos, como o XML.
So muitas vezes referidos como a camada de viso que faz parte do segundo componente do padro de arquitetura de software
modelo-viso-controlador (MVC)

Benefcios
O principal benefcio de se utilizar templates a clara separao que eles criam entre a lgica de apresentao e o resto da sua
aplicao. Templates tm a responsabilidade exclusiva de exibir o contedo formatado. Eles no so responsveis por pesquisa de
dados, persistncia ou outras tarefas mais complexas. Isto leva a cdigo mais limpo, mais legvel que especialmente til em um
ambiente de equipe, onde os desenvolvedores trabalham no cdigo do lado do servidor (controladores, modelos) e designers
trabalham no cdigo do lado do cliente (markup).
Os templates tambm melhoram a organizao do cdigo de apresentao. Os templates so normalmente colocados em uma pasta
views, cada um definido dentro de um nico arquivo. Essa abordagem incentiva a reutilizao de cdigo, onde grandes blocos de
cdigo so quebrados em pequenos pedaos reutilizveis, chamados frequentemente de partials. Por exemplo, o cabealho e o
rodap do site de cada um pode ser definido como templates, que so ento includos antes e depois de cada template de pgina.
Finalmente, dependendo da biblioteca que voc usa, os templates podem oferecer mais segurana ao escapar automaticamente o
contedo gerado pelo usurio. Algumas bibliotecas oferecem at mesmo sand-boxing, onde os criadores de templates s tm acesso
white-listed (lista branca) de variveis e funes.

Templates Simples em PHP


Templates Simples em PHP so templates que usam cdigo nativo do PHP. Eles so uma escolha natural j que o PHP na
realidade um linguagem de template por si s. Isso significa simplesmente que voc pode combinar cdigo PHP dentro de outro
cdigo, como HTML. Isso benfico para os desenvolvedores de PHP pois no h uma nova sintaxe para aprender, eles sabem as
funes disponveis e seus editores de cdigo PHP j tem syntax highlighting and auto-completion embutidos. Alm disso, estes
templates tendem a ser muito mais rpido j que no necessria a fase de compilao.
Cada framework moderno PHP emprega algum tipo de sistema de templates, a maioria usam PHP simples por padro. Fora dos
frameworks, bibliotecas como Plates ou Aura.View tornam o trabalho mais fcil, oferecendo funcionalidade modernas ao template,
tais como herana, layouts e extenses.

Exemplo de um template simples em PHP


Utilizando a biblioteca Plates.

<?php // user_profile.php ?>


<?php $this->insert('header', ['title' => 'User Profile']) ?>

26/11/2015 13:36

PHP: Do Jeito Certo

19 de 37

http://br.phptherightway.com/

<h1>User Profile</h1>

<p>Hello, <?=$this->escape($name)?></p>
<?php $this->insert('footer') ?>

Exemplo de um template simples em PHP usando herana


Utilizando a biblioteca Plates.

<?php // template.php ?>


<html>
<head>

<title><?=$title?></title>

</head>
<body>
<main>

<?=$this->section('content')?>

</main>
</body>
</html>

<?php // user_profile.php ?>


<?php $this->layout('template', ['title' => 'User Profile']) ?>
<h1>User Profile</h1>

<p>Hello, <?=$this->escape($name)?></p>

Templates Compilados
Enquanto o PHP evoluiu para uma linguagem orientada a objetos madura, ele no melhorou muito como uma linguagem de
templates. Templates compilados, como Twig ou Smarty*, preenchem este vazio oferecendo uma nova sintaxe que foi direcionada
especificamente para templating. De escape automtico, herana e estruturas de controle simplificadas, templates compilados so
projetados para ser mais fcil de escrever, simples de ler e mais seguro de usar. Templates compilados pode ser at compartilhados
entre diferentes linguagens, Mustache vem sendo um bom exemplo disso. Uma vez que esses templates devem ser compilados h
uma pequena queda de performance, no entanto, este mnimo quando o cache apropriado usado.
** Enquanto Smarty oferece escape automtico, este recurso NO est habilitado por padro.*

Exemplo simples de um template compilado


Utilizando a biblioteca Twig.

{% include 'header.html' with {'title': 'User Profile'} %}


<h1>User Profile</h1>

<p>Hello, {{ name }}</p>


{% include 'footer.html' %}

Exemplo de templates compilados usando herana


Utilizando a biblioteca Twig.
// template.php

26/11/2015 13:36

PHP: Do Jeito Certo

20 de 37

http://br.phptherightway.com/

<html>
<head>

<title>{% block title %}{% endblock %}</title>

</head>
<body>
<main>

{% block content %}{% endblock %}

</main>
</body>
</html>

// user_profile.php
{% extends "template.html" %}
{% block title %}User Profile{% endblock %}
{% block content %}

<h1>User Profile</h1>

<p>Hello, {{ name }}</p>

{% endblock %}

Templates - Leitura Adicional


Artigos & Tutoriais

Templating Engines in PHP


An Introduction to Views & Templating in CodeIgniter
Getting Started With PHP Templating
Roll Your Own Templating System in PHP
Master Pages
Working With Templates in Symfony 2

Bibliotecas

Aura.View (nativo)
Blade (compilado, especfico do framework)
Dwoo (compilado)
Latte (compilado)
Mustache (compilado)
PHPTAL (compilado)
Plates (nativo)
Smarty (compilado)
Twig (compilado)
Zend\View (nativo, especfico do framework)

Erros e Excees
Erros

Em muitas linguagens de programao que fazem o uso generalizado das excees, sempre que algo d errado uma exceo
lanada. Esta certamente uma forma vivel de fazer as coisas, mas o PHP uma linguagem que utiliza menos excees. Mesmo
que elas existam e mais membros do ncleo de desenvolvimento estejam comeando a us-las quando trabalhando com objetos, o
PHP ir na maioria das vezes tentar manter a linha de processamento independentemente do que acontea, a no ser que ocorra um
erro fatal.
Por exemplo:

26/11/2015 13:36

PHP: Do Jeito Certo

21 de 37

http://br.phptherightway.com/

$ php -a

php > echo $foo;

Notice: Undefined variable: foo in php shell code on line 1

Este apenas um notice error e o PHP ir continuar a excecuo. Isso pode ser confuso para quem vem de linguagens
exception-heavy, porque referncia a uma varivel que falta em Python, por exemplo, ir lanar uma exceo:
$ python

>>> print foo

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

NameError: name 'foo' is not defined

A nica diferena real que Python vai surtar sobre qualquer coisa pequena, de modo que os desenvolvedores podem ter certeza
que qualquer problema em potencial ou caso extremo ser capturado, enquanto o PHP ir continuar o processamento, a menos que
algo extremo acontea e neste ponto ir lanar um erro e relat-lo.

Severidade dos Erros

O PHP tem vrios nveis de severidade de erro. Os trs tipos mais comuns de mensagens so erros, avisos e advertncias (error,
notice e warnings). Estes tm diferentes nveis de severidade; E_ERROR , E_NOTICE e E_WARNING . Erros so erros fatais em
tempo de execuo e so geralmente causados por falhas no seu cdigo e precisam ser corrigidos medida que eles causam a parada
da execuo do PHP. Os avisos so erros no fatais, a execuo do script no ser interrompida. Avisos so mensagens de conselho
causadas por um cdigo que pode ou no causar problemas durante a execuo do script, a execuo no interrompida.
Outro tipo de mensagem de erro relatado em tempo de compilao so mensagens E_STRICT . Estas mensagens so usadas para
sugerir mudanas no seu cdigo para ajudar a assegurar melhor interoperabilidade e compatibilidade com futuras verses do PHP.

Mudando o comportamento do relatrio de erros do PHP

O relatrio de erros pode ser alterado nas configuraes do PHP e/ou atravs de chamadas de funo. Usando a funo nativa do
PHP error_reporting() voc pode definir o nvel dos erros para a durao da execuo do script, passando um dos nveis de erro
pr-definidos, ou seja, se voc s quer ver os Warnings e os Errors - mas no Notices - ento voc pode configurar como:
<?php

error_reporting(E_ERROR | E_WARNING);

Voc tambm pode controlar ou no os erros que so exibidos na tela (bom para o desenvolvimento) ou ocultados e registrados
(bom para produo). Para mais informaes, verifique a seo Error Reporting.

Supresso de erros

Voc tambm pode dizer ao PHP para suprimir erros especficos com o operador de controle de erro @ . Voc coloca este operador
no incio de uma expresso e qualquer erro resultado pela expresso ser suprimido.
<?php

echo @$foo['bar'];

A sada ser $foo['bar'] se existir, mas vai simplesmente devolver um null e no mostrar nada, se a varivel $foo ou chave
'bar' no existir. Sem o operador de controle de erros, essa expresso poderia criar um erro PHP Notice: Undefined variable:
foo ou PHP Notice: Undefined index: bar`.
Isto pode parecer uma boa idia, mas h alguns efeitos indesejveis. O PHP lida com expresses usando o @ de uma forma menos
eficaz do que expresses sem o @. Otimizao prematura pode ser a raiz de todos os argumentos de programao, mas se o
desempenho particularmente importante para o seu aplicativo/biblioteca importante entender as implicaes de desempenho
do operador de controle de erro.
Em segundo lugar, o operador de controle de erro engole completamente o erro. O erro no exibido e no enviado para o log
de erro. Alm disso, os sistemas de produo PHP no possuem nenhuma maneira de desligar o operador de controle de erro.

26/11/2015 13:36

PHP: Do Jeito Certo

22 de 37

http://br.phptherightway.com/

Enquanto voc pode estar certo que o erro que voc est vendo inofensivo, um erro diferente e menos inofensivo ser silenciado.
Se h uma maneira de evitar o uso do operador de supresso de erro ento voc deve considerar isso. Por exemplo, nosso cdigo
acima poderia ser reescrito da seguinte forma:
<?php

echo isset($foo['bar']) ? $foo['bar'] : '';

Um exemplo em que a supresso de erro pode fazer sentido onde a funo fopen() falha em no conseguir encontrar o arquivo
para carregar. Voc pode verificar a existncia do arquivo antes de tentar carreg-lo, mas se o arquivo for apagado aps a verificao
e antes da fopen() (que pode parecer impossvel, mas pode acontecer), ento a fopen() retornar false e lanar um erro. Isso
potencialmente algo que o PHP dever resolver, mas um caso em que a supresso de erro pode parecer a nica soluo vlida.
Anteriormente mencionamos no h nenhuma maneira para desligar o operador de controle de erro. No entanto o xDebug tem uma
configurao xdebug.scream que ir desativar o operador de controle de erro. Voc pode definir essa opo seu arquivo php.ini
com o seguinte.
xdebug.scream = On

Voc tambm pode definir esse valor em tempo de execuo com a funo ini_set
<?php

ini_set('xdebug.scream', '1')

A extenso PHP Scream oferece funcionalidade semelhante do xDebug, embora a configurao do Scream seja chamada
scream.enabled .
Isso muito til quando voc est a depurao do cdigo e suspeita de um erro informativo suprimida. Use o scream com cuidado
e como uma ferramenta de depurao. H muitos cdigos da biblioteca PHP que podem no funcionar com o operador de controle
de erro desativado.
Operadores de Controle de Erro
SitePoint
xDebug
Scream

ErrorException

O PHP uma linguagem perfeitamente capaz de ser exception-heavy e requer apenas algumas linhas de cdigo para fazer a troca.
Basicamente, voc pode lanar seus erros como excees, utilizando a classe ErrorException , que estende a classe
Exception .
Esta uma prtica comum implementada por um grande nmero de frameworks modernos, como Symfony e Laravel. Por padro
Laravel ir exibir todos os erros como excees usando o pacote Whoops! se o app.debug estiver ligado e em seguida escond-los
se estiver desligado.
Ao lanar erros como excees em desenvolvimento voc pode lidar com eles melhor do que o de costume, e se voc ver uma
exceo durante o desenvolvimento voc pode envolv-lo em uma instruo catch com instrues especficas sobre como lidar com
a situao. Cada exceo que voc pega instantaneamente faz da sua aplicao um pouco mais robusto.
Mais informaes e os detalhes sobre como usar o ErrorException com tratamento de erros podem ser encontradas em Classe
ErrorException.
Operadores de Controle de Erro
Constantes pr-definidas para manipulao de erros
error_reporting
Reporting

Excees
26/11/2015 13:36

PHP: Do Jeito Certo

23 de 37

http://br.phptherightway.com/

Excees so uma parte padro da maioria das linguagens populares, mas elas sao frequentemente negligenciadas pelos
programadores de PHP. Linguagens como Ruby usam pesadamente o sistema de Excees, ento sempre que algo de errado
acontece, como um pedido HTTP que falha, ou uma consulta ao banco de dados gera um erro, ou at mesmo se uma imagem no
puder ser encontrada, o Ruby (ou suas bibliotecas que estiverem sendo utilizadas) iro disparar uma exceo para a tela, assim voc
saber imediatamente que algo est errado.
O PHP por si s bastante relaxado com isso, e uma chamada para file_get_contents() ir resultar apenas em um FALSE e
um alerta. Muitos frameworks antigos, como CodeIgniter, iro apenas retornar um FALSE , registrar uma mensagem em seus logs
proprietrios e talvez deixar que voc use um mtodo como $this->upload->get_error() para ver o que houve de errado. O
problema, aqui, voc tem que sair procurando por um erro e verificar na documentao para saber como achar o mtodo que
retorna o erro para essa classe, em vez de ter isso de forma extremamente bvia.
Outro problema quando as classes automaticamente disparam um erro para a tela e finalizam o processo. Quando voc faz isso
voc impede que outro programador seja capaz de dinamicamente lidar com o erro. Excees devem ser disparadas para que os
desenvolvedores fiquem a par do erro, para ento decidirem como lidar com ele. Ex:
<?php

$email = new Fuel\Email;

$email->subject('My Subject');

$email->body('How the heck are you?');

$email->to('guy@example.com', 'Some Guy');


try
{
}

$email->send();

catch(Fuel\Email\ValidationFailedException $e)
{
}

// A validao falhou

catch(Fuel\Email\SendingFailedException $e)
{
}

// O driver no pode enviar o e-mail

finally
{
}

// Executado independentemente de se uma exceo foi acionada e antes de retomar a execuo normal

Excees SPL

A classe genrica Exception fornece muito pouco contexto de depurao para o desenvolvedor; no entanto, para remediar esta
situao, possvel criar uma Exception especializada como sub-classes da classe genrica Exception :
<?php

class ValidationException extends Exception {}

Isso significa que voc pode adicionar mltiplos blocos de captura para lidar com diferentes Excees. Isso pode lhe levar a criao
de muitas excees customizadas e algumas delas poderiam ter sido evitadas como o uso das Excees SPL (excees da biblioteca
padro) que esto disponveis em SPL extension.
Se por exemplo voc fizer uso do mtodo mgico __call() e o mtodo chamado for invlido, ento em vez de disparar uma
exceo padro que seria muito vaga, ou criar uma exceo apenas para isso, voc poderia disparar apenas um throw new
BadFunctionCallException; .
Leia sobre Excees
Leia sobre SPL Exceptions
Aninhando excees no PHP
Melhores prticas com excees no PHP 5.3

26/11/2015 13:36

PHP: Do Jeito Certo

24 de 37

http://br.phptherightway.com/

Segurana

Segurana em uma Aplicao Web

Existem pessoas ruins prontas e dispostas a invadir sua aplicao web. importante que voc tome as medidas necessrias para
reforar a segurana da sua aplicao web. Felizmente, o pessoal bacana da Open Web Application Security Project (OWASP)
compilou uma lista abrangente dos problemas de segurana conhecidos e dos mtodos para se proteger contra eles. uma leitura
obrigatria para o desenvolvedor preocupado com segurana.
Leia o Guia OWASP de Segurana

Hash de Senhas
No fim, todos construmos aplicaes PHP que dependem de login dos usurios. Usurios e senhas (com hash) so armazenadas em
um banco de dados e posteriormente so usados para autenticar os usurios no login.
importante que voc faa adequadamente o hash das senhas que so armazenadas em um banco de dados. O hash da senha
irreversvel, uma funo executada contra a senha do usurio. Isto produz uma sequncia de comprimento fixo que no pode ser
revertido. Isto significa que voc pode comparar um hash contra o outro para determinar se ambos foram produzidos da mesma
string, mas voc no pode determinar o string original. Se as senhas no estiverm com hash, e seu banco for hackeado ou acessado
por algum no autorizado, todas as contas dos usurios ficaro comprometidas. Alguns usurios (infelizmente) usam a mesma
senha para outros servios. Por isso, importante levar segurana a srio.
Faa o hash das senhas com password_hash
No PHP 5.5 password_hash foi adicionado. Neste momento utiliza o BCrypt, o mais forte algortimo suportado pelo PHP. Ele ser
atualizado no futuro para suportar mais algortimos conforme for preciso. A biblioteca password_compat foi criada para ter
compatibilidade para o PHP >= 5.3.7.
Abaixo um exemplo, vamos fazer o hash de uma string, e em seguida, verificamos o hash contra uma nova string. As duas string so
diferentes (secret-password vs. bad-password) e por isso o login falhar.
<?php

require 'password.php';
$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);
if (password_verify('bad-password', $passwordHash)) {
//Senha correta

} else {
}

//Senha errada

Aprenda sobre password_hash

password_compat para PHP >= 5.3.7 && < 5.5

Aprenda sobre hashing no que diz respeito criptografia


PHP password_hash RFC

Filtro de Dados
Nunca, jamais (nunca mesmo), confie em entradas externas feitas no seu cdigo PHP. Sempre higienize (sanitize) e valide as
entradas externas antes de utiliz-las no seu cdigo. As funces filter_var e filter_input podem higienizar textos e validar
formatos (e.g. endereos de email).
Entradas externas podem ser qualquer coisa: dados de entrada de formulrio $_GET ou $_POST , alguns valores na superglobal
$_SERVER e o corpo da requisio HTTP via fopen('php://input', 'r') . Lembre-se, entradas externas no esto limitadas a
dados de formulrios enviados pelo usurio. Arquivos carregados e baixados, valores em sesses, dados dos cookies e dados de web
services de terceiros tambm so entradas externas.

26/11/2015 13:36

PHP: Do Jeito Certo

25 de 37

http://br.phptherightway.com/

Enquanto o dado externo puder ser armazenado, combinado ou acessado posteriormente, ele continua sendo uma entrada externa.
Todo momento que voc processar, emitir, concatenar ou incluir dados no seu cdigo, pergunte a si mesmo se eles foram filtrados
adequadamente e se so confiveis.
Os dados podem ser filtrados de maneiras diferentes baseando-se em sua finalidade. Por exemplo, quando entradas externas no
filtradas so passadas para uma sada de pgina HTML, elas podem executar HTML e JavaScript no seu site! Isso conhecido como
Cross-Site Scripting (XSS) e pode ser um ataque bem perigoso. Um modo de evitar o XSS higienizar todas as tags HTML da
entrada, removendo as tags ou escapando-as usando entidades HTML.
Outro exemplo ao passar opes para execuo na linha de comando. Isso pode ser extremamente perigoso (e geralmente m
ideia), mas voc pode usar a funo embutida escapeshellarg para higienizar os argumentos executados.
Um ltimo exemplo aceitar entradas externas para determinar o carregamento de um arquivo do sistema de arquivos. Isso pode
ser explorado alterando o nome e o caminho do arquivo. Voc precisa remover os /, ../, null bytes e outros caracteres do
caminho do arquivo, dessa forma no ser possvel carregar arquivos ocultos, privados ou confidenciais.
Aprenda sobre filtro de dados
Aprenda sobre a filter_var
Aprenda sobre a filter_input
Aprenda sobre tratamento de null bytes

Higienizao/Sanitization

A higienizao remove (ou escapa) caracteres ilegais ou inseguros das entradas externas.
Por exemplo, voc deveria higienizar entradas externas antes de inclu-las no HTML ou de inseri-las em consultas SQL brutas.
Quando voc usar parmetros restritos com a PDO, ela j ir higienizar as entradas para voc.
s vezes ser obrigatrio permitir algumas tags HTML seguras na sua entrada quando estiver incluindo-as em um pgina HTML.
Isso bem difcil de fazer e muitas evitam isso utilizando outros formatos mais restritos, como o Markdown ou o BBCode, embora
bibliotecas para listas brancas/whitelistening, como a HTML Purifier, existem por essa razo.
Veja sobre os Filtros de Higienizao

Validao

A validao garante que as entradas externas so o que voc espera. Por exemplo, voc pode querer validar um endereo de email,
um nmero de telefone ou uma idade quando for processar o envio de um registro.
Veja sobre os Filtros de Validao

Arquivos de Configurao
Quando criar arquivos de configurao para suas aplicaes, as melhores prticas recomendam que um dos seguintes mtodos seja
seguido:
recomendado que voc armazene sua informao de configurao onde ela no possa ser acessada diretamente ou puxada
atravs do sistema de arquivos.
Se voc tiver que armazenar seus arquivos de configurao no diretrio raiz, nomeie os arquivos com a extenso .php . Isso
garante que, mesmo se um script for acessado diretamente, ele no ser mostrado como texto puro.
As informaes nos arquivos de configurao devem ser adequadamente protegidas, ou atravs de criptografia ou por
permisses de grupos/usurios no sistema de arquivos

Register Globals
OBSERVAO: A partir do PHP 5.4.0 a configurao register_globals foi removida e no pode mais ser utilizada. Isto s foi
includo como um alerta para algum no processo de atualizao de uma aplicao legada.
Quando habilitada, a configurao register_globals torna disponvel, no escopo global da sua aplicao, vrios tipos de variveis
( $_POST , $_GET e $_REQUEST ). Isso pode facilmente levar a problemas de segurana pois sua aplicao no pode dizer de
forma efetiva de onde o dado est vindo.

26/11/2015 13:36

PHP: Do Jeito Certo

26 de 37

http://br.phptherightway.com/

Por exemplo: $_GET['foo'] poderia ficar disponvel via $foo , o que poderia sobrescrever variveis que no tiverem sido
declaradas. Se voc estiver usando PHP < 5.4.0 garanta que register_globals esteja desligado.
Register_globals no manual do PHP

Relatrio de Erros
O registro de erros pode ser til para encontrar pontos problemticos em sua aplicao, mas isso tambm pode expor informaes
sobre a estrutura de sua aplicao para o mundo exterior. Para proteger efetivamente sua aplicao dos problemas que poderiam
ser causados com a exposio dessas mensagens, voc precisa configurar seu servidor de formas diferentes quando em
desenvolvimento versus quando em produo (no ar).

Desenvolvimento

Para mostrar erros no seus ambiente de desenvolvimento, configure as definies a seguir no seu php ini :
display_errors = On

display_startup_errors = On
error_reporting = -1
log_errors = On

Do php.net:

Passar o valor -1 ir mostrar todos os erros possveis, at mesmo quando novos nveis e constantes
forem adicionados em verses futuras do PHP. A constante E_ALL tambm se comporta desta maneira
a partir do PHP 5.4.
O nvel de error E_STRICT foi introduzido no 5.3.0 e no faz parte do E_ALL , contudo ele tornou-se parte do E_AL no 5.4.0. O
que isso significa? Que para mostrar todos os erros possveis na verso 5.3 voc precisa usar -1 ou E_ALL | E_STRICT .
Reportando todos os erros possveis em diferentes verses do PHP
< 5.3 -1 ou E_ALL
5.3 -1 ou E_ALL | E_STRICT
> 5.3 -1 ou E_ALL

Produo

Para esconder os erros no seu ambiente de produo, configure seu php.ini assim:
display_errors = Off

display_startup_errors = Off
error_reporting = E_ALL
log_errors = On

Com essas configuraes em produo, os erros continuaro sendo registrados nos logs de erros do servidor web, mas eles no
sero mostrados para o usurio. Para mais informaes sobre essas configuraes, veja o manual do PHP:
error_reporting
display_errors
display_startup_errors
log_errors

Testes

Escrever testes automatizados para o seu cdigo PHP considerado uma boa prtica, e leva a aplicaes bem escritas. Testes
automatizados so uma excelente ferramenta para garantir que sua aplicao no ir quebrar quando voc estiver fazendo
alteraes ou adicionando novas funcionalidades, e no deveriam ser ignorados.

26/11/2015 13:36

PHP: Do Jeito Certo

27 de 37

http://br.phptherightway.com/

Existem vrios tipos diferentes de ferramentas de testes (ou frameworks) disponveis para PHP, com diferentes abordagens: todas
elas tentam evitar os testes manuais e a necessidade de equipes grandes de Garantia de Qualidade Quality Assurance, ou QA)
apenas para garantir que alteraes recentes no interrompam funcionalidade existentes.

Desenvolvimento Guiado por Testes


Da Wikipedia:

O desenvolvimento guiado por testes (TDD) um processo de desenvolvimento que se baseia na


repetio de um ciclo de desenvolvimento bem curto: primeiro o desenvolvedor escreve um caso de teste
automatizado que falha, definindo uma melhoria ou uma nova funo desejada, em seguida produz o
cdigo para passar no teste, e finalmente refatora o novo cdigo pelos padres aceitveis. Kent Beck,
que creditado como quem desenvolveu ou redescobriu essa tcnica, afirmou em 2003 que o TDD
encoraja design simples e inspira confiana.
Existem vrios tipos diferentes de testes que voc pode fazer para sua aplicao.

Testes Unitrios

Testes unitrios so uma metodologia de programao que garante que as funes, as classes e os mtodos esto funcionando como
esperado, desde o momento que voc os constri at o fim do ciclo de desenvolvimento. Verificando como os valores entram e saem
em vrias funes e mtodos, voc pode garantir que a lgica interna est funcionando corretamente. Utilizando Injeo de
Dependncias e construindo classes mock e stubs, voc pode verificar se as dependncias foram utilizadas corretamente para uma
cobertura de testes ainda melhor.
Quando for criar uma classe ou funo, voc deveria criar um teste unitrio para cada comportamento que ela deveria ter. Num
nvel bem bsico, voc deveria garantir que so emitidos erros quando voc envia argumentos errados e garantir que tudo funciona
bem se voc enviar argumentos vlidos. Isso ajudar a garantir que, quando voc alterar sua classe ou sua funo posteriormente no
ciclo de desenvolvimento, as funcionalidades antigas continuaro funcionando como esperado. A nica alternativa a isso seria usar
var_dump() em um test.php, o que no o certo a fazer na construo de uma aplicao - grande ou pequena.
O outro uso para testes unitrios contribuir para projetos open source. Se voc puder escrever um teste que demonstra uma
funcionalidade incorreta (i.e. uma falha), em seguida consert-la e mostrar o teste passando, os patches sero muito mais
suscetveis a serem aceitos. Se voc estiver em um projeto que aceite pull requests, voc deveria sugerir isso como um requisito.
O PHPUnit o framework de testes de fato para escrever testes unitrios em aplicaes PHP, mas existem vrias alternativas:
SimpleTest
Enhance PHP
PUnit
atoum

Testes de Integrao
Da Wikipedia:

Testes de integrao (chamado s vezes de Integrao e Teste, abreviado como I&T) a fase do teste
do software na qual mdulos individuais do sistema so combinados e testados como um grupo. Ela
acontece aps os testes unitrios e antes dos testes de validao. Os testes de integrao recebem como
entrada os mdulos que foram testados unitariamente, os agrupa em grandes blocos, aplica testes
definidos em um plano de teste de integrao, e entrega como sada o sistema integrado pronto para os
testes de sistema.
Muitos das mesmas ferramentas que so usadas para testes unitrios podem ser usadas para testes de integrao, pois muitos dos
mesmos princpios so usados.

Testes Funcionais

Algumas vezes conhecidos tambm como testes de aceitao, os testes funcionais consistem em utilizar ferramentas para criar
testes automatizados que usem de verdade sua aplicao, em vez de apenas verificar se unidades individuais de cdigo se
comportam adequadamente ou se essas partes conversam entre si do jeito certo. Essas ferramentas geralmente trabalham usando
dados reais e simulam usurios verdadeiros da sua aplicao.

26/11/2015 13:36

PHP: Do Jeito Certo

28 de 37

http://br.phptherightway.com/

Selenium
Mink
O Codeception um framework de testes full-stack que inclui ferramentas para testes de aceitao
O Storyplayer um framework de testes full-stack que inclui suporte para criao e destruio de ambientes sob demanda

Desenvolvimento Guiado por Comportamentos


Existem dois tipos diferentes de Desenvolvimento Guiado por Comportamentos (BDD): o SpecBDD e o StoryBDD. O SpecBDD foca
nos comportamentos tcnicos, no cdigo, enquanto que o StoryBDD foca nos comportamentos de negcio e de funcionalidades, nas
interaes. O PHP possui frameworks para ambos os tipos de BDD.
No StoryBDD, voc escreve histrias humanamente legveis que descrevem o comportamento da sua aplicao. Estas histrias
podem ento ser executadas como testes reais em sua aplicao. O framework usado nas aplicaes PHP para StoryBDD o Behat,
que foi inspirado no projeto Cucumber do Ruby e implementa a linguagem Gherkin DSL para descrever o comportamento das
funcionalidades.
No SpecBDD, voc escreve as especificaes que descrevem como seu cdigo real deveria se comportar. Em vez de escrever uma
funo ou mtodo, voc descreve como a funo ou o mtodo deveriam se comportar. O PHP fornece o framework PHPSpec para
esse propsito. Esse framework foi inspirado no projeto RSpec do Ruby.

Links sobre BDD

O Behat inspirado pelo projeto Cucumber do Ruby


O PHPSpec o framework para SpecBDD do PHP
O Codeception um framework de testes full-stack que usa os princpios do BDD

Ferramentas Complementares para Testes


Alm dos testes individuais e dos frameworks guiados por comportamentos, tambm existe uma srie de frameworks genricos e
bibliotecas auxiliares teis para qualquer das abordagem escolhidas.

Links para as Ferramentas

O Selenium uma ferramenta para automao de navegao que pode ser intregada ao PHPUnit
O Mockery um Framework para Objetos Mock que pode ser integrado ao PHPUnit e ao PHPSpec.
O Prophecy um framework para Objetos Mock bastante obstinado porm poderoso e flexvel. integrado com PHPSpec e
pode ser usado com PHPUnit(http://phpunit.de/).

Servidores e Publicao

As aplicaes PHP podem ser publicadas e executadas em servidores web de produo de diversas formas.

Plataforma como Servio (PaaS)


O PaaS fornece o sistema e a arquitetura de rede necessrios para executar aplicaes PHP na web. Isso significa no precisar de
quase nenhuma configurao para publicar aplicaes ou frameworks PHP.
Recentemente o PaaS se tornou um mtodo popular para publicar, hospedar e escalar aplicaes PHP de todos os tamanho . Voc
pode encontrar uma lista de fornecedores de PHP PaaS Platform as a Service na seo sobre recursos.

Servidores Virtuais ou Dedicados


Se voc estiver confortvel com administrao de sistemas, ou estiver interessado em aprender sobre isso, os servidores virtuais ou
dedicados te do controle completo do ambiente de produo da sua aplicao.

nginx e PHP-FPM
26/11/2015 13:36

PHP: Do Jeito Certo

29 de 37

http://br.phptherightway.com/

O PHP, por meio do seu Gerenciador de Processos FastCGI (FPM), funciona muito bem junto com o nginx, que um servidor web
leve e de alta performance. Ele usa menos memria do que o Apache e pode lidar melhor como muitas requisies concorrentes. Ele
importante especialmente em servidores virtuais que no tem muita memria sobrando.
Leia mais sobre o nginx
Leia mais sobre o PHP-FPM
Leia mais sobre como configurar de forma segura o nginx e o PHP-FPM

Apache e PHP

O PHP e o Apache tem um longo histrico juntos. O Apache amplamente configurvel e tem muitos mdulos disponveis para
estender suas funcionalidades. Ele uma escolha popular para servidores compartilhados e pela configurao fcil em frameworks
PHP e aplicativos open source como, o Wordpress. Infelizmente, o Apache utiliza mais recursos do que o nginx por padro e no
pode lidar com tantos visitantes ao mesmo tempo.
O Apache tem vrias configuraes possveis para executar o PHP. A mais comum e mais fcil para configurar a prefork MPM com
o mod_php5. Mesmo no sendo a mais eficiente em memria, a mais simples para comear a usar. Essa provavelmente a melhor
escolha se voc no quiser entrar muito profundamente nos aspectos de administrao do servidor. Observe que, se voc usar o
mod_php5, ter que usar o prefork MPM.
Alternativamente, se voc quiser extrair mais performance e estabilidade do seu Apache ento voc poderia se beneficiar do mesmo
sistema FPM que o nginx e executar o worker MPM ou o event MPM com o mod_fastcgi ou com o mod_fcgi. Essa configurao ser
significativamente mais eficiente em relao a memria e muito mais rpida, mas gera mais trabalho.
Leia mais sobre o Apache
Leia mais sobre os Multi-Processing Modules
Leia mais sobre o mod_fastcgi
Leia mais sobre o mod_fcgid

Servidores Compartilhados
O PHP tem que agradecer aos servidores compartilhados por sua popularidade. difcil encontrar uma hospedagem que no tenha
o PHP instalado, mas certifique-se de que seja a ltima verso. Servidores compartilhados permitem que voc e outros
desenvolvedores publiquem sites em uma nica mquina. A parte boa que isso se tornou uma commodity barata. A parte ruim
que voc nunca sabe que tipo de baguna seus vizinhos vo criar; sobrecarregamento do servidor e abertura de falhas de segurana
so os principais problemas. Evite usar servidores compartilhados se o oramento de seu projeto permitir.

Compilando e Implementando sua Aplicao


Se voc se pegar fazendo alteraes manuais no seu esquema do banco de dados ou rodando seus testes manualmente antes de
alterar seus arquivos (manualmente), pense duas vezes! A cada tarefa manual adicional necessria para implementar uma nova
verso da sua aplicao as chances de erros fatais so potencialmente maiores, Seja lidando com uma simples atualizao, um
processo completo de implementao ou at mesmo uma estratgia de integrao contnua, a Automao de Compilao sua
amiga.
Entre as tarefas que talvez voc deseja automatizar esto:
Gerenciamento de Dependncias
Compilao e Compresso de Arquivos
Execuo de Testes
Criao de Documentao
Empacotamento
Implementao

Ferramentas de Automao

Ferramentas de automao podem ser descritas como uma coleo de scripts que tratam de tarefas comuns da implementao de
software. As ferramentas de automao no so parte da sua aplicao, elas agem na sua aplicao externamente.
Existem muitas ferramentas de cdigo aberto disponveis para ajudar voc com o processo de automao, algumas so escritas em
PHP, outras no. Isso no deve impedi-lo de us-las, se elas se ajustarem melhor ao trabalho em questo. Aqui esto alguns
exemplos:

26/11/2015 13:36

PHP: Do Jeito Certo

30 de 37

http://br.phptherightway.com/

Phing o jeito mais fcil de comear com automao de implementao no PHP. Com Phing voc pode controlar os processos de
empacotamento, implementao e testes atravs de um simples arquivo XML. Phing (Que baseado em Apache Ant) fornece um
rico conjunto de tarefas geralmente necessrias para instalar ou atualizar uma aplicao web e pode ser estendido com tarefas
adicionais personalizadas, escritas em PHP.
Capistrano um sistema para programadores intermediarios ou avanados que executa comando de forma estruturada e
repetitiva em uma ou mais maquinas. Ele pr-configurado para implementar aplicaes Ruby on Rails, entretanto pessoas esto
implementando com sucesso sistemas em PHP com ele. Ter sucesso com uso de Capistrano depende de um conhecimento
de trabalho com Ruby e Rails.
O artigo de Dave Gardner PHP Deployment com Capistrano um bom ponto de partida para desenvolvedores PHP interessando
em Capistrano.
Chef mais que um framework de implementao, um framework de integrao bastante poderoso escrito em Ruby que no
consegue apenas implementar sua aplicao mas tambm construir seu ambiente de servidor completo em maquinas virtuais.
Contedo sobre Chef para Desenvolvedores PHP:
Serie em 3 partes sobre implementao de uma aplicao LAMP com Chef, Vagrant, e EC2
Chef Cookbook sobre instalao e configurao de PHP 5.3 e do sistema de gerenciamento de pacotes PEAR
Chef - srie de video tutoriais por Opscode, os criadores do chef
Leitura Adicional:
Automatize seu projeto com Apache Ant

Integrao Contnua

Integrao Contnua uma prtica de desenvolvimento de software onde membros de um time


integram seu trabalho com frequncia, geralmente essa integrao ocorre diariamente - levando a
muitas integraes de cdigo por dia. Muitos times acreditam que essa abordagem leva a redues
significativas dos problemas de integrao e permite que o time desenvolva software de forma coesa e
rpida.

Martin Fowler
Existem diferentes formas de se implementar integrao contnua com PHP. Recentemente o Travis CI tem feito um timo trabalho
ao fazer da integrao contnua uma realidade mesmo para pequenos projetos. O Travis CI um sistema de integrao contnua na
nuvem desenvolvido pela comunidade de cdigo livre. Esta integrado com GitHub e oferece suporte de primeira classe para muitas
linguagens incluindo PHP.
Leitura Adicional:
Integrao Contnua com Jenkins
Integrao Contnua com PHPCI
Integrao Contnua com Teamcity

Virtualizao
Executar seu aplicativo em ambientes diferentes de desenvolvimento e produo pode levar a aparecer erros estranhos. Tambm
complicado manter diferentes ambientes de desenvolvimento atualizados com a mesma verso de todas as bibliotecas usadas
quando se trabalha com uma equipe de desenvolvedores.
Se voc estiver desenvolvendo em Windows e implantando de Linux (ou qualquer coisa no-Windows) ou esto desenvolvendo em
uma equipe, voc deve considerar o uso de uma mquina virtual. Isso parece complicado, mas alm dos ambientes de virtualizao
amplamente conhecidos como o VMware ou VirtualBox, existem ferramentas adicionais que podem ajud-lo a configurar um
ambiente virtual em algumas etapas fceis.

Vagrant
O Vagrant ajuda a construir suas mquinas virtuais em cima de ambientes virtuais conhecidos e a configurar esses ambientes com
base em um nico arquivo de configurao. As mquinas virtuais base (box) podem ser configuradas manualmente, ou voc pode

26/11/2015 13:36

PHP: Do Jeito Certo

31 de 37

http://br.phptherightway.com/

usar um software de provisionamento como o Puppet ou o Chef para fazer isso por voc. Provisionar o box uma tima maneira
de garantir que as mltiplas mquinas virtuais sejam configuradas de forma idntica e que voc no necessite manter complicadas
listas de comandos de configurao. Voc pode tambm destruir (destroy) o box base e recri-lo sem muitos passos manuais,
tornando fcil criar instalaes novas.
O Vagrant cria pastas compartilhadas para compartilhar seu cdigo entre sua mquina e a mquina virtual, assim voc pode criar e
editar seus arquivos na sua mquina e ento executar seu cdigo dentro da mquina virtual.

Uma pequena ajuda

Se voc precisa de uma pequena ajuda para inciar o uso do Vagrant existem dois servios que podem ser teis: - Rove: servio que
permite que voc gere configuraes tpicas do Vagrant, sendo o PHP uma das opes. O provisionamento realizado com Chef. Puphpet: interface grfica simples de configurar mquinas virtuais para o desenvolvimento PHP. Altamente focada em PHP.
Alm VMs local, ele pode ser usado para implantar em servios de nuvem tambm. O provisionamento feito com Puppet. Protobox: uma camada em cima do vagrant e uma interface grfica web para configurao de mquinas virtuais para o
desenvolvimento web. Um nico documento YAML controla tudo o que est instalado na mquina virtual. - Phansible: oferece uma
interface que ajuda a gerar Ansible Playbooks para projetos baseados em PHP.

Docker
Junto ao Vagrant, uma outra maneira fcil de obter um ambiente de desenvolvimento ou produo virtual instalado e funcionando
o Docker. O Docker ajuda voc a fornecer recipientes Linux para todos os tipos de aplicaes. H muitas imagens Docker teis que
podem fornecer outros grandes servios sem a necessidade de instalar estes servios em sua mquina local, por exemplo, MySQL ou
PostgreSQL e muito mais. D uma olhada no Docker Hub Registry para procurar uma lista de recipientes pr-construdos
disponveis, que voc pode executar e usar em poucos passos.

Exemplo: Runnning suas aplicaes PHP em Docker

Depois de instalar o docker em sua mquina, voc pode iniciar um apache com suporte a PHP em uma nica etapa. O comando a
seguir ir baixar uma instalao apache totalmente funcional com a ltima verso do PHP e fornecer o diretrio /path/to
/your/php/files em http://localhost:8080 :
docker run -d --name my-php-webserver -p 8080:80 -v /path/to/your/php/files:/var/www/html/ php:apache

Depois de executar o docker run seu recipiente estar inicializado e funcionando. Se voc quiser parar (stop) ou iniciar (start) o
seu recipiente novamente, voc pode usar o atributo --name fornecido e simplesmente executar o docker stop my-phpwebserver e docker start my-php-webserver sem fornecer novamente os demais parmetros mencionados acima.

Saiba mais sobre Docker

Os comandos mencionados acima mostram apenas uma maneira rpida de executar um servidor web apache com suporte a PHP,
mas h muito mais coisas que voc pode fazer com Docker. Uma das coisas mais importantes para os desenvolvedores de PHP
ligar seu servidor web com uma instncia de banco de dados, por exemplo. Como fazer isso est bem descrito no Guia do Usurio
Docker.
Docker
Instalao do Docker
Imagens Docker no Docker Hub Registry
Guia do Usurio Docker

Cache

O PHP bem rpido por si s, mas gargalos podem aparecer quando voc faz conexes remotas, ou carrega arquivos etc.
Felizmente, existem vrias ferramentas disponveis para acelerar certas partes de sua aplicao, ou para reduzir o nmero de vezes
que essas tarefas, que tomam tempo, precisem ser executadas.

Cache de Bytecode
Quando um arquivo PHP executado, por baixo dos panos ele primeiro compilado para bytecode (tambm conhecido como
opcode) e, s a, o bytecode executado. Se o arquivo PHP no foi modificado, o bytecode ser sempre o mesmo. Isso significa que o

26/11/2015 13:36

PHP: Do Jeito Certo

32 de 37

http://br.phptherightway.com/

passo de compilao um desperdcio de recursos de CPU.


aqui que entra o cache de Bytecode. Ele previne as compilaes redundantes armazenando bytecode na memria e reutilizando-o
em chamadas sucessivas. A configurao do cache de bytecode feita em questo de minutos, e sua aplicao ir acelerar de forma
significativa. No existe razo para no utiliz-lo.
No PHP 5.5 o OPcache foi includo como um cache de bytecode nativo chamado OPcache. Ele tambm est disponvel para verses
anteriores.
Caches de bytecode populares so:
OPcache (desde o PHP 5.5)
APC (PHP 5.4 e anteriores)
XCache
Zend Optimizer+ (parte do pacote Zend Server)
WinCache (extenso para o MS Windows Server)

Cache de Objetos
Existem momentos onde pode ser benfico fazer cache de objetos individuais no seu cdigo, como em dados que so custosos de
conseguir ou em chamadas de bancos de dados cujo resultado dificilmente se modifica. Voc pode usar um software de cache de
objetos para armazenar esses pedaos de dados na memria, para acess-los posteriomente de forma extremamente rpida. Se voc
guardar esses itens em um data store logo que os recuperar, e depois os enviar diretamente do cache para as suas requisies
posteriores, voc conseguir uma melhora significativa no desempenho alm de reduzir a carga nos seus servidores de banco de
dados.
Muitas das solues populares de cache de bytecode permitem que voc tambm faa cache de dados personalizados, assim h
ainda mais razes para se beneficiar deles. Tanto o APC, quanto o XCache e o Wincache fornecem APIs para armazenar dados do
seu cdigo PHP na memria cache deles.
Os sistemas mais usados para cache de objetos em memria so o APC e o memcached. O APC uma escolha excelente para cache
de objetos, ele inclui uma API simples para adicionar seus prprios dados para seu cache de memria e muito fcil de configurar e
utilizar. A nica limitao real do APC que ele fica amarrado ao servidor onde ele est instalado. O memcached por outro lado
instalado como um servio separado e pode ser acessado atravs da rede, assim voc pode armazenar objetos em um data store
ultra-rpido, em uma localizao central, e vrios sistemas diferentes podem acess-lo.
Note que se estiver rodando o PHP como uma aplicao (Fast-)CGI dentro do seu servidor web, cada processo do PHP ter seu
prprio cache, ou seja, os dados de APCu no so compartilhados entre diferentes processos. Nesse caso voc deve considerar usar
mecached em seu lugar, j que ele no est ligado aos processos do PHP.
Em uma configurao em rede, o APC geralmente ter um desempenho melhor do que o memcached em termos da velocidade de
acesso, mas o memcached poder escalar mais rpido e melhor. Se voc no planeja ter mltiplo servidores executando sua
aplicao, ou no precisar das funcionalidades extras que o memcached oferece, ento o APC provavelmente sua melhor opo
para cache de objetos.
Exemplo de lgica usando APC:
<?php

// verifica se existe um dado salvo como 'expensive_data' no cache


$data = apc_fetch('expensive_data');
if (!$data)
{

// dado no est no cache, faa a chamada custosa e guarde-a para usar depois
$data = get_expensive_data();

apc_store('expensive_data', $data);

print_r($data);

Note que, antes do PHP 5.5, APC possui tanto um cache de objetos quanto um cache de bytecode. APCu um projeto que tem como
objetivo trazer o cache de objetos do APC para o PHP 5.5, j que o PHP agora possui um cache bytecode nativo (OPcache).

26/11/2015 13:36

PHP: Do Jeito Certo

33 de 37

http://br.phptherightway.com/

Aprenda mais sobre sistemas populares de cache de objetos:


APCu
Funes APC
Memcached
Redis
XCache APIs
Funes do WinCache

Recursos
Da Fonte

Site do PHP
Documentao do PHP

Pessoas para Seguir


Rasmus Lerdorf
Fabien Potencier
Derick Rethans
Chris Shiflett
Sebastian Bergmann
Matthew Weier OPhinney
Pdraic Brady
Anthony Ferrara
Nikita Popov

Mentoring
phpmentoring.org - Mentoring formal e pessoa-para-pessoa na comunidade PHP.

Fornecedores de PaaS PHP


PagodaBox
AppFog
Heroku
fortrabbit
Engine Yard Cloud
Red Hat OpenShift Platform
dotCloud
AWS Elastic Beanstalk
cloudControl
Windows Azure
Zend Developer Cloud
Google App Engine
Jelastic

Frameworks
Em vez de reinventar a roda, muitos desenvolvedores PHP usam frameworks para construir aplicaes web. Os frameworks
abstraem muitas das preocupaes de baixo nvel e fornecem interfaces teis e fceis de utilizar para completar tarefas comuns.
Voc no precisa usar um framework para todo projeto. Algumas vezes, PHP puro a maneira certa de fazer, mas se voc realmente
precisar de um framework existem trs tipos disponveis:
Micro Frameworks
Full-Stack Frameworks

26/11/2015 13:36

PHP: Do Jeito Certo

34 de 37

http://br.phptherightway.com/

Component Frameworks
Os micro-frameworks so essencialmente invlucros para rotear uma requisio HTTP para um callback, ou um controller, ou um
mtodo etc., da forma mais rpida possvel, e algumas vezes possuem algumas bibliotecas para auxiliar no desenvolvimento, como
por exemplo pacotes bsicos para bancos de dados. Eles so proeminentemente usados para construir servios HTTP remotos.
Muitos frameworks adicionam um nmero considervel de funcionalidades ao que est disponvel em um micro-framework e so
conhecidos como frameworks completos ou full-stack. Eles frequentemente possuem ORMs, pacotes de autenticao, entre outros
componentes embutidos.
Frameworks baseados em componentes so colees de bibliotecas especializadas ou de propsito-nico. Diferentes frameworks
baseados em componentes podem ser utilizados conjuntamente para criar um micro-framework ou um framework completo.
Frameworks PHP Populares

Componentes
Como mencionado acima Componentes so so uma outra abordagem comum para a o objetivo comum de criao, distribuio e
implementao de cdigo compartilhado. Existem vrios repositrios de componentes, os dois principais so:
Packagist
PEAR
Ambos repositrios possuem ferramentas de linha de comando para ajudar a instalao e processos de atualizao, e foram
explicados com mais detalhes na seo Gerenciamento de Dependncia
H tambm componentes de frameworks e componentes de fornecedores que no oferecem nenhum framework. Estes projetos
fornecem outra fonte de pacotes que idealmente tem pouco ou nenhum dependncias de outros pacotes, ou estruturas especficas.
Por exemplo, voc pode usar o FuelPHP Validation package sem precisar usar o framework FuelPHP em si.
Aura
FuelPHP
Hoa Project
Orno
Componentes Symfony
A Liga Extraordinria de pacotes
Componentes Illuminate do Laravel
Eloquent ORM
Fila
Outros Componentes Illuminate do Laravel viro com menor desacoplamento do framework Laravel. Por enquanto, apenas os
componentes mais desacoplados do framework Laravel esto listados acima.

Livros
H uma grande quantidade de livros em sobre PHP, mas alguns so infelizmente bastante antigos e j no contm informaes
precisas. H ainda livros publicados para o PHP 6, que no existe e nunca ir existir. A prxima grande verso do PHP chamar
PHP 7 por causa destes livros.
Esta seo tem como objetivo ser um documento vivo de livros recomendados sobre o desenvolvimento PHP em geral. Se voc
gostaria que o seu livro seja adicionado, envie um PR e ser revistado para relevncia.

Livros gratuitos

PHP The Right Way - Este site est disponvel como um livro totalmente de graa

Livros Pagos

Modernizing Legacy Applications In PHP - Get your code under control in a series of small, specific steps
Building Secure PHP Apps - Learn the security basics that a senior developer usually acquires over years of experience, all
condensed down into one quick and easy handbook

26/11/2015 13:36

PHP: Do Jeito Certo

35 de 37

http://br.phptherightway.com/

The Grumpy Programmers Guide To Building Testable PHP Applications - Learning to write testable doesnt have to suck
Securing PHP: Core Concepts - A guide to some of the most common security terms and provides some examples of them in
every day PHP
Scaling PHP - Stop playing sysadmin and get back to coding
Signaling PHP - PCNLT signals are a great help when writing PHP scripts that run from the command line.

Comunidade

A comunidade PHP to diversa quanto grande, e seus membros esto prontos e dispostos para a apoiar novos programadores
PHP. Considere se juntar ao grupo de usurios PHP (PUG) de sua localidade ou participar das grandes conferncias PHP para
aprender mais sobre as melhores prticas mostradas aqui. Voc tambm pode entrar no IRC, no canal #phpc em irc.freenode.com e
tambm seguir o @phpc no twitter. V l, conhea novos desenvolvedores, aprenda sobre novos assuntos e, acima de tudo, faa
novos amigos. Outros recursos da comunidade incluem o Google+ PHP Programmer community e o StackOverflow.
Veja o Calendrio de Eventos Oficiais do PHP

Grupos de Usurios PHP


Se voc vive em uma cidade grande, provavelmente tem um grupo de usurios PHP por perto. Embora no exista ainda uma lista
oficial de PUGs, voc pode encontrar facilmente seu PUG local buscando no Google ou no Meetup.com ou PHP.ug. Se voc vive em
uma cidade menor, talvez no exista um PUG local; se for o caso, comece um!
Devem ser feitas menes especiais a dois grupos de usurios globais: NomadPHP e PHPWomen. NomadPHP oferece duas
reunies on-line mensalmente com apresentaes de alguns dos principais oradores da comunidade PHP. PHPWomen um grupo
de usurios mas no exclusivo que originalmente voltado para as mulheres no mundo do PHP. A associao aberta a todos os
que buscam uma comunidade mais diversificada. PHPWomen oferece ajuda, orientao, educao e geralmente promove a criao
de uma atmosfera profissional mais feminina.
Leia sobre Grupos de Usurios na PHP Wiki

Conferncias PHP
A comunidade PHP tambm oferece grandes conferncias regionais e nacionais em muitos pases no mundo todo. Membros bem
conhecidos da comunidade PHP geralmente palestram nesses grandes eventos, por isso eles so uma excelente oportunidade para
aprender diretamente dos lderes do setor.
Encontre uma Conferncia PHP

PHPDoc

PHPDoc um padro informal para comentar cdigo PHP. H um monte de diferentes tags disponveis. A lista completa de tags e
exemplos podem ser encontrados no Manual do PHPDoc.
Abaixo est um exemplo de como voc pode documentar uma classe com alguns mtodos;
<?php
/**

* @author Um nome <a.name@example.com>

* @link http://www.phpdoc.org/docs/latest/index.html
* @package helper
*/

class DateTimeHelper
{

/**

* @param mixed $anything Tudo que podemos converter para um objeto \DateTime
*

* @return \DateTime

* @throws \InvalidArgumentException
*/

26/11/2015 13:36

PHP: Do Jeito Certo

36 de 37

http://br.phptherightway.com/
public function dateTimeFromAnything($anything)
{

$type = gettype($anything);
switch ($type) {
}

// Algum cdigo que tenta retornar um objeto \DateTime

throw new \InvalidArgumentException(


);

"Failed Converting param of type '{$type}' to DateTime object"

/**

* @param mixed $date Tudo que podemos converter para um objeto \DateTime
*

* @return void
*/

public function printISO8601Date($date)


{

echo $this->dateTimeFromAnything($date)->format('c');

}
/**

* @param mixed $date Tudo que podemos converter para um objeto \DateTime
*/

public function printRFC2822Date($date)


{
}

echo $this->dateTimeFromAnything($date)->format('r');

A documentao para a classe como um todo, em primeiro lugar tem a tag @author, esta tag usada para documentar o autor do
cdigo e pode ser repetido para documentar vrios autores. Em segundo lugar a tag @link, usada para conectar-se a um site que
indica uma relao entre o site eo cdigo. Em terceiro lugar, tem a tag @package, usada para categorizar o cdigo.
Dentro da classe, o primeiro mtodo tem uma tag @param usada para documentar o tipo, nome e descrio do parmetro sendo
passado para o mtodo. Alm disso, ele tem as tags @return e @throws para documentar o tipo de retorno e todas as excees que
podem ser lanadas respectivamente.
O segundo e terceiro mtodos so muito semelhantes e tm uma nica marcao @param, assim como o primeiro mtodo. A
diferena de importao entre o segundo eo terceiro mtodo bloco doc a incluso/excluso da tag @return. @return void nos
informa explicitamente que no h retorno, historicamente omitir a declarao @return void tambm resulta na mesma ao
(sem retorno).

Criado e mantido por


Josh Lockhart

Colaboradores do projeto
Kris Jordan

Phil Sturgeon

Contribuintes
philsturgeon
codeguy

edgarsandi

rogeriopradoj
klaussilveira
KrisJordan
pauloelr

tonicospinelli

26/11/2015 13:36

PHP: Do Jeito Certo

37 de 37

http://br.phptherightway.com/
grakic

marcelsud

stevenbenner
leviferreira

markushausammann
chartjes

peterkokot
Xosofox

zeroecco
royopa

wilkerlucio

briannesbitt

auroraeosrose
eoconnell

gerardroche
getjump
Inoryy

wilmoore
ziadoz

Blackshawk
chriscct7

telephone

Patrocinadores do projeto
New Media Campaigns

PHP: Do Jeito Certo por Josh Lockhart est sob a licena Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
Baseado em um trabalho em www.phptherightway.com.

26/11/2015 13:36