LIVRO PHP MODERNO Capítulo 1. O Novo PHP
A linguagem PHP está experimentando um renascimento. PHP está se transformando em uma linguagem de script moderna com características úteis, como namespaces, traits, closures , e um built-in opcode cache. cache. O moderno ecossistema PHP PHP está evoluindo evoluindo tambm. tambm. desenvolvedores desenvolvedores PHP dependem menos de estruturas monolíticas e mais em componentes especiali!ados especiali!ados menores. o "omposer gerente de depend#ncia está revolucionando a forma como vamos construir aplica$%es PHP& 'ue nos emancipa do (ardim murado de um 'uadro e nos permite misturar e combinar PHP interoperável interop erável componentes mais ade'uados para as nossas aplica$%es personali!adas PHP. PHP. interoperabilidade dos componentes n)o seria possível sem os padr%es da comunidade proposto e com curadoria do *rame+o PHP rupo nterop. PHP moderno o seu guia para o novo PHP, e vai mostrar-lhe como construir e implantar aplica$%es surpreendentes surpreendentes com PHP usando padr%es da comunidade, boas práticas, e componentes interoperáveis.
Passado Antes de explorarmos o PHP moderno, importante compreender a origem do PHP. PHP uma linguagem interpretadora de script do lado do servidor. sto significa 'ue voc# escreve c/digo PHP, envia ele para um servidor +eb, e executa com um intrprete. PHP normalmente usada com um servidor +eb Apache Apache ou nginx para servir conteúdo din0mico. 1o entanto, PHP tambm podem ser usados para construir aplica$%es de linha de comando poderosos 2como bash, 3ub4, P4thon, P4thon, e assim por diante5. 6uitos desenvolvedores desenvolvedores PHP n)o n)o percebem isso isso e perdem uma característica característica muito emocionante. 1)o voc#, apesar de tudo. 7oc# pode ler a hist/ria oficial do PHP na página http899php.net9manual9histor4.php.php. :u n)o vou repetir o 'ue (á foi dito t)o bem por 3asmus ;erdorf 2o criador do PHP5. O 'ue eu vou di!er-lhe 'ue o PHP tem um passado tumultuado. PHP come$ou come$ou como uma cole$)o de scripts " escrito por 3asmus ;erdorf para rastrear as visitas ao seu currículo online. ;erdorf nomeou seu con(unto de scripts "
??@ e >??, PHP sofreu inúmeras revis%es e ainda recebeu alguns reescreve ground-up . Andi utmans e Beev Curasi, dois desenvolvedores de =el Aviv, (untoram for$as com 3asmus ;erdorf para para transformar PHP a partir de uma pe'uena pe'uena cole$)o cole$)o de ferramentas de " em uma linguagem de programa$)o completa com uma sintaxe mais consistente e suporte básico para programa$)o orientada a ob(etos. :les nomearam seu PHP produto final D e lan$aram no final de >??. O novo apelido PHP foi uma partida de nomes anteriores, e uma recursiva acrEnimo para PHP8 H4pertext Preprocessor. PHP D foi a primeira vers)o 'ue a maioria assemelhava ao PHP 'ue n/s conhecemos ho(e. :le forneceu a extensibilidade superior a várias bases de dados, protocolos e APs. extensibilidade do PHP D atraiu muitos novos desenvolvedores desenvolvedores para o pro(eto. Ao final de >??, o PHP D (á foi instalado em um escalonamento escalonamento de >FG dos servidores +eb do mundo.
Presente Ho(e, a linguagem PHP está evoluindo rapidamente e apoiada por de!enas de e'uipes de desenvolvedores de todo o mundo. práticas de desenvolvimento mudaram tambm. 1o passado, era prática comum para gravar um ar'uivo PHP, enviá-lo para um servidor de produ$)o com *=P, e espero 'ue ele trabalhou. :sta uma estratgia de desenvolvimento terrível, mas foi necessário devido falta de ambientes de desenvolvimento locais viáveis. Ho(e em dia, n/s evitamos o *=P e utili!amos controle de vers)o em ve! disso. soft+are de controle de vers)o como it a(udam a manter um hist/rico de c/digo auditável 'ue pode ser ramificada, bifurcada, e se fundiram. Ambientes de desenvolvimento locais s)o id#nticos aos servidores de produ$)o gra$as a ferramentas de virtuali!a$)o como 7agrant e provisionamento ferramentas como Ansible, "hef e Puppet. 1/s alavancagem especiali!ada componentes PHP com o gerente de depend#ncia "omposer . 1osso c/digo PHP adere ao PC3 - normas comunitárias geridas pelo rupo PHP *rame+or nterop. 1/s absolutamente testamos nosso c/digo com ferramentas como o PHPInit. 1/s implantar nossos aplicativos com PHP *ast" gerente de processo atrás de um servidor +eb como o nginx. : n/s aumentamos o desempenho do aplicativo com um cache opcode. PHP moderna engloba muitas práticas novas 'ue podem ser desconhecidos para a'ueles de voc#s de novo para PHP, ou para a'ueles atuali!ando a partir de vers%es mais antigas do PHP. 1)o se sinta sobrecarregado. :u andarei atravs de cada conceito mais adiante neste livro. :u tambm estou animado 'ue o PHP tem agora um pro(ecto de especifica$)o oficial - algo 'ue faltava at JF>@. Nota
A maioria das linguagens de programa$)o maduras t#m uma especifica$)o. :m termos leigos, a especifica$)o um modelo canEnico 'ue define o 'ue significa ser PHP. :ste plano usado por desenvolvedores 'ue criam programas 'ue analisam, interpretar e executar c/digo PHP. sto n)o para desenvolvedores 'ue criam aplicativos e sites com PHP. Cara olemon e *aceboo anunciaram o pro(ecto de primeira especifica$)o PHP na OK3eill4 de confer#ncia OC"O1 em JF>@. 7oc# pode ler o anúncio oficial sobre o funcionamento interno do PHP mailing list, e voc# pode ler a especifica$)o PHP no itHub. Ima especifica$)o oficial linguagem PHP cada ve! mais importante, dada a introdu$)o de múltiplos motores de PHP concorrentes. O motor de PHP original o Bend :ngine, um PHP intrprete escrito em " e introdu!ido no PHP @. A Bend :ngine foi criado por 3asmus ;erdorf, Andi utmans, e Beev Curasi. Ho(e, a Bend :ngine a Bend empresa de A principal contribui$)o para a comunidade PHP. 1o entanto, existe agora uma segunda grande motor PHP - a 6á'uina 7irtual HipHop do *aceboo. A garante especifica$)o de linguagem 'ue ambos os motores de manter um grau de compatibilidade de linha de base. Nota
Im motor de PHP um programa 'ue analisa, interpreta e executa o c/digo PHP 2por exemplo, o Bend 6otor ou HipHop 7irtual 6achine do *aceboo5. sto n)o para ser confundido com PHP, 'ue uma refer#ncia genrica para a linguagem PHP.
Futuro A Bend :ngine está melhorando em um ritmo rápido, com novas funcionalidades e melhor desempenho. :u atribuo as melhorias Bend :ngine sua nova competi$)o, especificamente HipHop 7irtual 6achine do *aceboo e linguagem de programa$)o Hac . Hac uma nova linguagem de programa$)o construída em cima de PHP. ntrodu! tipagem estática, novas estruturas de dados e interfaces adicionais, mantendo a compatibilidade com vers%es anteriores com c/digo PHP tipagem din0mica existente. Hac voltada para desenvolvedores 'ue apreciam PHP características rápido desenvolvimento, mas precisa da previsibilidade e estabilidade da tipagem estática. Nota
7amos discutir din0mica contra tipagem estática mais adiante neste livro. A diferen$a entre o dois 'uando os tipos de PHP s)o verificados. tipos din0micos s)o verificados em tempo de execu$)o, en'uanto estática tipos s)o verificados em tempo de compila$)o. r direto para o "apítulo >J para mais informa$%es. O HipHop 7irtual 6achine 2HH765 um PHP e intrprete Hac 'ue utili!a uma s/ no time 2L=5 para melhorar o desempenho do aplicativo e redu!ir o uso de mem/ria. 1)o preve(o Hac and HH76 substituindo o Bend :ngine, mas o *aceboo de novo contribui$%es est)o criando um respingo gigante na comunidade PHP. O aumento da concorr#ncia fe! com 'ue a e'uipe principal Bend :ngine para anunciar PHP M, um Bend :ngine otimi!ado Ni!-se 'ue a par com HH76. 7amos discutir estes desenvolvimentos ainda mais no "apítulo >J. um momento emocionante para ser um programador PHP. A comunidade PHP nunca foi t)o energi!ado, divertida e inovadora. :spero 'ue este livro a(uda voc# firmemente abra$ar o PHP práticas modernas. Há uma tonelada de coisas novas para aprender, e muitas mais coisas no hori!onte. "onsidere este o seu roteiro. Agora vamos come$ar.
Capítulo 2. Características
A linguagem PHP moderna tem muitos novos recursos interessantes. 6uitos desses recursos será novo para programadores PHP atuali!a$)o de vers%es anteriores, e eles v)o ser uma boa surpresa para programadores migra$)o para o PHP de outro idioma. :sses novos recursos tornar a linguagem PHP uma plataforma poderosa e proporcionar uma experi#ncia agradável para os aplica$%es +eb de constru$)o e ferramentas de linha de comando. Algumas destas características n)o s)o essenciais, mas eles ainda facilitam nossas vidas. Alguns recursos, contudo, s)o essenciais. 1amespaces, por exemplo, s)o uma pedra angular do PHP moderna normas e permitir práticas de desenvolvimento 'ue os modernos desenvolvedores PHP exame para concedido 2Por exemplo, carregamento automático5. 7ou apresentar cada novo recurso, explicar por 'ue útil, e mostrar-lhe como implementá-lo em seus pr/prios pro(etos. Dica
:ncora(o-vos a acompanhar no seu pr/prio computador. 7oc# pode encontrar todo o c/digo do texto exemplos companheiro reposit/rio itHub do livro.
Namespaces
Ce há um moderno recurso de PHP eu 'uero 'ue voc# saiba, namespaces. introdu!ido em PHP .D.F, namespaces s)o uma importante ferramenta 'ue organi!a o c/digo PHP em uma hierar'uia, comparável a estrutura de diret/rios do sistema de ar'uivos do seu sistema operacional. "ada componente de PHP moderno e estrutura organi!a seu c/digo globalmente sob a seu pr/prio fornecedor namespace exclusivo para 'ue n)o entre em conflito com, ou reclamar, classe comum nomes usados por outros fornecedores. Nota
7oc# n)o odeia 'uando voc# anda em uma lo(a de caf e essa pessoa detestável tem uma confus)o de livros, cabos e outros enfeites espalhados por várias mesasQ Cem mencionar 'ue ele sentado ao lado, mas n)o usar, a única tomada disponível. :le está perdendo espa$o valioso 'ue poderiam ser úteis para voc#. *igurativamente falando, essa pessoa n)o está usando namespaces. 1)o se(a essa pessoa. 7amos ver como um componente PHP do mundo real usa namespaces. O *rame+or C4mfon4 pr/prio s4mfon4 9 Http*oundation um componente PHP popular 'ue gerencia solicita$%es H==P e respostas. 6ais importante, o componente s4mfon4 9 Http*oundation usa comum nomes de classe PHP como 3e'uest, 3esponse, e "ooie. :u garanto 'ue voc# há muitos outros componentes de PHP 'ue usam os mesmos nomes de classe. "omo podemos usar a componente de PHP 9 Http*oundation s4mfon4 se outro c/digo PHP usa os mesmos nomes de classeQ Podemos usar com seguran$a o componente s4mfon4 9 Http*oundation precisamente por'ue seu c/digo sandboxed abaixo do namespace único fornecedor C4mfon4. 7isite a s4mfon4 componente Http*oundation 9 no itHub e navegue at o ar'uivo 3esponse.php. isto parece com a *igura J->.
Olhe atentamente para linha >J. :le contm este c/digo8 namespace
SymfonyComponentHttp!oun"at#on$
:sta uma declara$)o PHP namespace, e sempre aparece em uma nova linha imediatamente ap/s a abertura tag RQphp . :sta declara$)o de namespace em particular nos di! várias coisas. :m primeiro lugar, sabemos 'ue a vida da classe 3esponse abaixo do namespace fornecedor C4mfon4 2o fornecedor namespace o namespace de nível superior5. Cabemos 'ue a classe 3esponse vive debaixo o subnamespace "omponent. Cabemos tambm as vidas de classe 3esponse abaixo ainda outra subnamespace chamado Http*oundation. 7oc# pode ver outros ar'uivos ad(acentes 3esponse.php, e voc# vai ver 'ue eles usam a mesma declara$)o de namespace. Im espa$o para nome 2ou subnamespace5 encapsula e organi!a classes PHP relacionados, assim como um sistema de ar'uivos diret/rio contm ar'uivos relacionados. Dica
Cubnamespaces s)o separados com um caractere S. Ao contrário do sistema de ar'uivos físico do seu sistema operacional, namespaces PHP s)o um conceito virtual e n)o necessariamente um mapa >8 > com diret/rios de ar'uivos. Nito isto, a maioria PHP componentes 'ue, de fato, mapeia subnamespaces ao sistema de ar'uivos diret/rios para compatibilidade com o popular PC3-@ padr)o autoloader 2falaremos mais sobre isso no "apítulo D5. 1ota =ecnicamente falando, namespaces s)o apenas uma nota$)o linguagem PHP referenciado pelo PHP intrprete para aplicar um prefixo do nome comum a um con(unto de classes, interfaces, fun$%es, e constantes.
Porque nós usamos Namespaces 1amespaces s)o importantes por'ue vamos criar o c/digo de área restrita, 'ue trabalha ao lado c/digo de outros desenvolvedores. :ste o conceito fundamental do componente PHP moderna ecossistema. "omponentes e 'uadro autores construir e distribuir o c/digo para um grande número de desenvolvedores PHP, e eles t#m nenhuma maneira de saber ou controlar o 'ue as classes, interfaces, fun$%es e constantes s)o usados (untamente com o seu pr/prio c/digo. :sse problema aplica-se a seus pr/prios pro(etos em casa, tambm. Ce voc# escrever componentes personali!ados do PHP ou classes para um pro(eto, 'ue o c/digo deve trabalhar ao lado de terceiros do seu pro(eto depend#ncias. "omo mencionei anteriormente com o componente s4mfon4 9 Http*oundation, seu c/digo e c/digo de outros desenvolvedores podem usar a mesma classe, interface, fun$)o ou nomes de constantes. Cem espa$os de nomes, um nome de colis)o fa! com 'ue o PHP falhe. "om namespaces, seu c/digo e c/digo de outros desenvolvedores podem usar a mesma classe, interface, fun$)o ou nome de constante assumindo 'ue o seu c/digo vive debaixo de um namespace fornecedor único. Ce voc# está construindo um pe'ueno pro(eto pessoal com apenas algumas depend#ncias, nome da classe closures provavelmente n)o será um problema. 6as 'uando voc# está trabalhando com uma e'uipe de constru$)o de uma grande
pro(eto com inúmeras depend#ncias de terceiros, closures de nomes tornam-se uma preocupa$)o real. 7oc# n)o pode controlar 'uais classes, interfaces, fun$%es e constantes s)o introdu!idas no espa$o global por depend#ncias do seu pro(eto. sso por 'ue namespacing seu c/digo importante.
Declaração
"ada classe PHP, interface, fun$)o e vidas constantes abaixo de um espa$o de nomes 2ou subnamespace5. 1amespaces s)o declaradas na parte superior de um ar'uivo PHP em uma nova linha imediatamente ap/s a abertura tag RQ php. A declara$)o namespace come$a com namespace, em seguida, um caractere de espa$o, ent)o o nome do espa$o para nome, e depois um fechamento ponto e vírgula & . ;embre-se 'ue namespaces s)o muitas ve!es utili!ados para estabelecer um nome do fornecedor de nível superior. :ste exemplo de declara$)o namespace estabelece o nome do fornecedor Oreill48 %&p'p namespace O(e#lly$
=odos as classes PHP, interfaces, fun$%es ou constantes declaradas abaixo desta declara$)o namespace de viver no namespace Oreill4 e s)o, de alguma forma, relacionados com OK3eill4 6eios de comunica$)o. O 'ue se 'ueria para organi!ar o c/digo relacionado com este livroQ 1/s usamos um subnamespace. Cubnamespaces s)o declarados exactamente o mesmo 'ue no exemplo anterior. O único diferen$a 'ue n/s separar nomes de namespace e subnamespace com a S personagem. O exemplo a seguir declara uma subnamespace chamado 6odernPHP 'ue vive abaixo da superior Oreill4 namespace fornecedor8 %&p'p namespace O(e#llyMo"e(nPHP$
=odas as classes, interfaces, fun$%es e constantes declaradas abaixo desta namespace declara$)o de viver no subnamespace Oreill4 S 6odernPHP e s)o, de alguma forma, relacionado com este livro. =odas as classes no mesmo espa$o para nome ou subnamespace n)o tem 'ue ser declarado na mesma ar'uivo PHP. 7oc# pode especificar um espa$o para nome ou subnamespace no topo de 'ual'uer ar'uivo PHP, e c/digo 'ue do ar'uivo torna-se uma parte desse espa$o de nomes ou subnamespace. sto torna possível para escrever várias classes em ar'uivos separados 'ue pertencem a um namespace comum. Nica O namespace mais importante o namespace fornecedor. :ste o namespace de nível superior 'ue identifica a sua marca ou organi!a$)o, e deve ser globalmente únicos. subnamespaces s)o menos importantes, mas eles s)o úteis para a organi!a$)o de c/digo do seu pro(eto.