Josh Lockhart Novatec
Authorized Portuguese translation of the English edition of titled Modern PHP, ISBN 9781491905012 2015 Josh Lockhart. This translation is published and sold by permission of O'Reilly Media, Inc., the owner of all rights to publish and sell the same. Tradução em português autorizada da edição em inglês da obra Modern PHP, ISBN 9781491905012 2015 Josh Lockhart. Esta tradução é publicada e vendida com a permissão da O'Reilly Media, Inc., detentora de todos os direitos para publicação e venda desta obra. Novatec Editora Ltda. 2015. Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora. Editor: Rubens Prates Tradução: Lúcia A. Kinoshita Revisão gramatical: Mari Kumagai Editoração eletrônica: Carolina Kuwabata Assistente editorial: Priscila A. Yoshimatsu ISBN: 978-85-7522-428-1 Histórico de impressões: Abril/2015 Primeira edição Novatec Editora Ltda. Rua Luís Antônio dos Santos 110 02460-000 São Paulo, SP Brasil Tel.: +55 11 2959-6529 Email: novatec@novatec.com.br Site: www.novatec.com.br Twitter: twitter.com/novateceditora Facebook: facebook.com/novatec LinkedIn: linkedin.com/in/novatec
Sumário Prefácio... 15 Parte I Recursos da linguagem... 21 Capítulo 1 O novo PHP... 22 Passado... 22 Presente... 23 Futuro... 25 Capítulo 2 Recursos... 26 Namespaces... 26 Por que usamos namespaces... 28 Declaração... 29 Importação e alias... 30 Dicas úteis... 33 Codificando para uma interface... 35 Traits... 40 Por que usar traits...41 Como criar um trait... 42 Como utilizar um trait... 44 Generators... 45 Criando um generator... 46 Usando um generator... 47 Closures... 49 Criando uma closure... 50 Associando estados... 52 Zend OPcache... 54 Habilitando o Zend OPcache... 55 Configurando o Zend OPcache... 56 Usando o Zend OPcache... 57 7
8 PHP Moderno Servidor HTTP integrado... 57 Iniciando o servidor... 58 Configurando o servidor... 58 Scripts roteadores... 59 Detectando o servidor integrado... 59 Desvantagens... 60 O que vem a seguir... 60 Parte II Boas práticas... 61 Capítulo 3 Padrões... 62 O PHP-FIG surge para nos ajudar... 62 Interoperabilidade entre frameworks... 63 Interfaces... 64 Autoloading... 64 Estilo... 64 O que é uma PSR?... 65 PSR-1: estilo básico de codificação... 66 PSR-2: estilo rigoroso de codificação... 67 PSR-3: interface para logger... 72 Criando um logger PSR-3... 73 Usando um logger PSR-3...74 PSR-4: autoloaders... 75 Por que os autoloaders são importantes... 75 A estratégia de autoloader da PSR-4... 76 Como implementar um autoloader PSR-4 (e por que você não deve fazê-lo)... 77 Capítulo 4 Componentes... 79 Por que usar componentes?... 79 O que são componentes?... 80 Componentes versus frameworks...81 Nem todos os frameworks são ruins... 82 Utilize a ferramenta correta para a tarefa... 83 Encontrando componentes... 84 Indo às compras... 85 Escolhendo um componente... 85 Proporcionando feedbacks... 86 Usando componentes PHP... 86 Como instalar o Composer... 87 Como usar o Composer... 88
Sumário 9 Exemplo de projeto...91 Composer e os repositórios privados... 94 Criando componentes PHP... 96 Nomes de fornecedor e de pacote... 96 Namespaces... 97 Organização do sistema de arquivos... 97 O arquivo composer.json... 98 O arquivo README... 101 Implementação do componente...102 Controle de versões...104 Submissão ao Packagist...105 Usando o componente... 106 Capítulo 5 Boas práticas... 107 Sanitizar, validar e escapar...107 Sanitizando as entradas...108 Validando dados...111 Escapando a saída... 113 Senhas... 113 Jamais tome conhecimento das senhas dos usuários... 114 Jamais restrinja as senhas dos usuários... 114 Jamais envie senhas dos usuários por email... 115 Gere a hash das senhas de usuário com o bcrypt... 115 API para hashing de senhas... 116 API de hashing de senha para versões de PHP anteriores a 5.5.0...122 Datas, horas e fusos horários...123 Definindo um fuso horário default...123 A classe DateTime...123 A classe DateInterval...125 A classe DateTimeZone...126 A classe DatePeriod...127 O componente nesbot/carbon...129 Bancos de dados...129 A extensão PDO...129 Conexões com o banco de dados e os DSNs...130 Prepared statements...133 Resultados de query...135 Transações...138 Strings multibyte...142 Codificação de caracteres...143 Gerando dados de saída em UTF-8...144
10 PHP Moderno Streams...144 Wrappers de stream...145 Contexto de stream...149 Filtros de stream...149 Filtros personalizados de stream...152 Erros e exceções...155 As exceções...156 Handlers de exceção... 160 Erros... 161 Handlers de erro...163 Erros e exceções durante o desenvolvimento...165 Ambiente de produção...167 Parte III Implantação, testes e ajustes... 170 Capítulo 6 Hosting... 171 Servidor compartilhado... 171 Servidor privado virtual...172 Servidor dedicado...173 PaaS...173 Escolhendo um plano de hosting... 174 Capítulo 7 Provisionamento... 175 Nossa meta...176 Configuração do servidor...176 Primeiro login...176 Atualizações de software...177 Usuário diferente de root...177 Autenticação SSH com par de chaves...178 Desabilitando o login com senhas e o login de root...180 PHP-FPM... 181 Instalação...182 Configuração global...182 Configuração do pool...183 nginx...187 Instalação...187 Host virtual...188 Automatizando o provisionamento dos servidores... 191 Delegando o provisionamento dos servidores...192
Sumário 11 Leituras complementares...192 O que vem a seguir...192 Capítulo 8 Ajustes... 193 O arquivo php.ini...193 Memória...194 Zend OPcache...195 Upload de arquivos...198 Tempo máximo de execução...198 Tratamento de sessões... 200 Bufferização de saída... 200 Realpath Cache... 201 O que vem a seguir... 201 Capítulo 9 Implantação... 202 Controle de versões... 202 Implantação automatizada... 203 Mantenha a simplicidade... 203 Torne a implantação previsível... 203 Torne a implantação reversível... 203 Capistrano... 203 Como o Capistrano funciona... 204 Instalação... 205 Configuração... 205 Autenticação... 207 Preparando o servidor remoto... 208 Hooks do Capistrano... 209 Implantação de sua aplicação... 209 Fazendo rollback de sua aplicação...210 Leituras complementares...210 O que vem a seguir...210 Capítulo 10 Testes... 211 Por que testamos?...211 Quando devemos testar?... 212 Antes... 212 Durante... 212 Depois... 212 O que devemos testar?... 213 Como testamos?... 213 Testes de unidade... 213
12 PHP Moderno Desenvolvimento orientado a testes (TDD)... 214 Desenvolvimento orientado a comportamento (BDD)... 214 PHPUnit...215 Estrutura de diretórios...216 Instalando o PHPUnit... 217 Instalando o Xdebug... 218 Configurando o PHPUnit... 219 A classe Whovian... 220 O caso de teste WhovianTest... 221 Executando os testes...224 Cobertura de código...225 Testes contínuos com o Travis CI... 226 Configuração... 227 Execução... 228 Leituras complementares... 228 O que vem a seguir... 228 Capítulo 11 Profiling... 229 Quando devemos usar um profiler... 229 Tipos de profilers... 230 Xdebug... 230 Configuração... 230 Acionando o profiler... 231 Análise...232 XHProf...232 Instalação...232 XHGUI...233 Configuração...234 Acionando o XHGUI...234 O profiler New Relic...235 Profiler Blackfire...235 Leituras complementares...235 O que vem a seguir... 236 Capítulo 12 HHVM e Hack... 237 HHVM...237 O PHP no Facebook... 238 Paridade entre HHVM e Zend Engine... 240 A HHVM é adequada para mim?... 240 Instalação... 241 Configuração...242
Sumário 13 Extensões...243 Monitorando a HHVM com o Supervisord...243 HHVM, FastCGI e nginx... 246 A linguagem Hack...247 Conversão de PHP para Hack... 248 O que é um tipo?... 248 Tipagem estática... 250 Tipagem dinâmica... 251 O Hack é uma via de mão dupla... 251 Verificação de tipos do Hack...252 Modos do Hack...253 Sintaxe do Hack... 254 Estruturas de dados do Hack... 256 HHVM/Hack versus PHP...257 Leituras complementares...259 Capítulo 13 Comunidade... 260 PUG local... 260 Conferências... 260 Orientação...261 Mantenha-se atualizado...261 Sites...261 Listas de correspondência...261 Twitter...261 Podcasts... 262 Humor... 262 Apêndice A Instalando o PHP... 263 Linux... 263 Gerenciadores de pacotes... 263 Ubuntu 14.04 LTS... 264 CentOS 7... 265 OS X...267 MAMP... 268 Homebrew...270 Geração do PHP a partir do código-fonte...275 Obtenha o código-fonte...276 Windows... 282 Binários... 283 WAMP... 283 Zend Server... 284
14 PHP Moderno Apêndice B Ambientes para desenvolvimento local... 285 VirtualBox... 286 Vagrant... 286 Comandos... 287 Boxes... 288 Inicialização... 288 Provisionamento... 289 Pastas sincronizadas... 290 Comece a trabalhar... 291 Sobre o autor... 294 Colofão... 295