Pessoal, depois de um bom tempo sem postar nada, muito menos publicar nenhum podcast novo, estamos voltando com chave de ouro.
Para quem não sabe, faltam algumas semanas para a PHP Conference Brasil 2012 e eu tenho uma cortesia silver, que corresponde ao ingresso gratuito para os dois dias de palestras (30/11 e 01/12).
Para participar é fácil, basta escrever um tweet parecido com esse:
Quero concorrer a uma cortesia silver para o PHP Conference Brasil 2012 que o getOnCode vai sortear. http://kingo.to/1d3g
É de extrema importância que o link http://kingo.to/1d3g esteja em seu tweet, pois será por intermédio dele que o sorteio será feito. Tweets que não tiverem o link acima serão desconsiderados.
Para sortear, será usado o site sorteie.me.
O sorteio será hoje (06/11/2012) as 22:30hs e o ganhador será avisado pelo próprio twitter e também aqui pelo site.
Um detalhe que não pode ser ignorado e a culpa é toda minha, é de que esta cortesia poderá ser usada somente até amanhã dia 07/11/2012, por isso que o sorteio será hoje a noite. Infelizmente eu acabei me atrapalhando com um monte de atividades que eu tive nos últimos dias e é por isso que sortearei em cima da hora.
Importante:
O getOnCode está sorteando apenas a cortesia que corresponde ao ingresso ao evento nos dias 30/11/2012 e 01/12/2012;
Qualquer despesa adicional como: Transporte, Alimentação, Hospedagem, etc., ou seja, qualquer coisa que não seja o ingresso ao evento fica por conta de quem for contemplado pelo sorteio;
As regras para uso da cortesia, definidas pela organização do evento encontram-se neste link;
Naturalmente, para obter os argumentos de linha de comando com node.js é necessário acessar a propriedade argv do objeto process:
O resultado do script acima é:
É possível observar que tratar estes parâmetros na mão é um pouco trabalhoso pois precisamos lidar com cada argumento acessando-os elemento-por-elemento do array e isso demanda certo esforço, para diminuir este trabalho pode-se utilizar a lib node-optimist.
Esta biblioteca é open-source e facilita muito o trabalho, veja o exemplo abaixo que é de uma pequena app que estou criando e cujo código disponibilizarei como open-source em breve:
Apesar de existirem diversas plataformas de blogging que oferecem recursos para publicação de conteúdo dinâmico como o WordPress por exemplo, tem sido comum atualmente encontrar quem defenda a criação de blogs usando mecanismos que gerem conteúdo estático para o mesmo fim.
O Objetivo deste post não é, entretanto, defender uma ou outra maneira de se publicar conteúdo em blogs e sim compartilhar o link de um post no blog de Matthew Weier O’Phinney, onde ele descreve os motivos pelo qual o levaram a adotar esta prática e também demonstrar brevemente como ele implementou a sua própria plataforma de Blog com Zend Framework 2 e como ele publica o conteúdo utilizando Git.
Eu pessoalmente já pensei várias vezes em criar meu próprio mecanismo para servir páginas estáticas e essa idéia me pareceu bem interessante apesar de, caso eu de fato implemente algo nesse sentido, eu faria um pouco diferente.
De qualquer maneira, a abordagem dele foi bem interessante e vale a pena a leitura.
Recentemente foi disponibilizada a versão 5.4.0 do PHP e neste post eu pretendo mostrar rapidamente o que eu achei mais interessante.
Servidor web embutido.
Um recurso que eu sempre achei interessante para usar em testes quando eu desenvolvi com Ruby on Rails era o servidor web embutido, que me permitia testar rapidamente qualquer alteração realizada no projeto.
Esta versão do PHP possui um servidor web que me pareceu bastante eficiente; Eu ainda não testei ele com um projeto desenvolvido com o Zend Framework, então eu não sei dizer como ele se comporta com re-escrita de URLs, por exemplo, mas em princípio me pareceu bem legal.
Para usa-lo basta inicializa-lo dentro do diretório que você deseja que seja o Document Root, por exemplo, C:\testes ou ~/testes, e executar o comando: php -S 0.0.0.0:8080 e em seguida o servidor é inicializado permitindo o acesso ao endereço localhost:8080 pelo browser.
A porta você pode escolher qual você quiser.
Quando ele está rodando nós podemos acompanhar as requisições no terminal:
Short Array Syntax
Nós podemos criar arrays em PHP usando o construtor array() da seguinte maneira:
Ou também podemos criar definindo os índices:
Agora com o PHP 5.4 nós podemos criar usando uma sintaxe mais simples para realizar os mesmos procedimentos:
Ou então:
Um array multi-dimensional escrito da maneira a qual estamos acostumados seria assim:
Com a nova sintaxe:
Traits
Traits adiciona uma flexibilidade maior quando estamos lidando com herança.
O PHP não dá suporte a herança múltipla e os traits permitem que algumas limitações impostas pela herança simples sejam reduzidas.
Pense nas traits como uma espécie de classe abstrata, porém, sem ser uma classe ou como um agrupador de métodos.
Eu sei, é esquisito mas eu não achei nenhuma definição melhor no momento.
Bom, imagine que nós temos uma classe chamada Arquivo e esta classe deve ter uma funcionalidade de escrita e outra de leitura, porém, vamos imaginar umas situação em que nós gostaríamos que a funcionalidade de leitura estivesse em uma classe chamada LeituraArquivo e a de escrita estivesse em uma outra classe chamada EscritaArquivo e nós gostaríamos também que a nossa classe Arquivo herdasse destas outras duas.
Em PHP isso é impossível pois PHP não suporta a herança múltipla, mas agora com traits nós podemos tentar separar estas duas funcionalidades fazendo uma espécie de herança horizontal ao invés da mais comum herança vertical.
Vamos ao código.
O exemplo acima demonstra de forma simples como os traits funcionam no PHP, mas existem mais alguns detalhes que são interessantes.
Um método que existe em uma classe sobre-escreve o método definido em uma trait, vamos supor que a nossa classe Arquivo já possua implementados os métodos ler e escrever, isso tornaria os métodos das traits inúteis.
Mas se você possui uma superclasse e nela está definido um método, a trait o sobre-escreve.
Vamos supor que a nossa classe Arquivo herde de uma superclasse chamada Base e ela possua os métodos ler e escrever definidos e ver esse comportamento em ação.
É possível também definir uma chamada a um método da classe pai em um método definido em uma trait.
A trait LerArquivo foi modificada para demonstrar:
Caso haja conflito de traits é disparado um fatal error, para ilustrar este problema será adicionado um método chamado salvar em cada trait e nós solucionaremos o conflito ‘configurando’ qual trait irá ser usada para invocar o método em conflito.
Alterando a visibilidade do método
Você pode definir um método em uma trait como private por exemplo, mas na classe onde a trait for utilizada, você pode mudar a visibilidade.
Traits compostas
Até aqui estava tranquilo, mas chega uma hora que as coisas sempre começam a ficar meio esquisitas, né?
Bom, se você quiser fazer uma trait que usa outra (ou outras) isso é possível também; Abaixo estão os códigos da trait composta e da classe que a utiliza:
Métodos abstratos e estáticos
É possível definir em uma trait se um método é estático ou abstrato.
A trait LerArquivo será alterada e serão definindos um método abstrato e outro estático, posteriormente a classe Arquivo será modificada para contemplar estas mudanças:
As traits também permitem definir propriedades, mas, algo que deve ser levado em conta é que se a classe que usar a trait definir uma propriedade com o mesmo nome que a propriedade definida na trait, você poderá receber um aviso E_STRICT caso o nome da propriedade e o valor sejam os mesmos ou um FATAL_ERROR caso o nome seja o mesmo e o valor não. Use com cuidado.
O PHP 5.4.0 além destas novas funcionalidades trouxe dezenas de correções de bugs, melhorias na performance, remoçõa de funcionalidades legadas como a função register_globals, entre outras coisas que você pode ver no changelog.
Como todos sabem (se não sabe e é um desenvolvedor PHP, você deveria saber) recentemente foi lançada a versão 5.4 do PHP; Não são todas as releases do PHP que eu costumo compilar mas, dessa vez eu resolvi fazê-lo para poder testar melhor os novos recursos que foram adicionados à linguagem.
Eu Continuarei usando o Apache que veio instalado no Mac e vou utilizar o Homebrew para instalar algumas dependências que serão necessárias.
Antes de começar, gostaria de esclarecer alguns pontos:
1- Eu tentei compilar com o XCode 4.2 e não obtive sucesso, então eu o removi e instalei apenas o command line tools for XCode (versão 4.3) pois eu estava com pressa e não queria esperar um tempão baixando o XCode completo. Você pode fazer o download dele na página de developers da Apple.
2- Estes procedimentos funcionaram muito bem no meu Mac, mas eu não garanto que o mesmo ocorrerá com o seu.
Vamos lá
Antes de começarmos, crie um arquivo chamado teste.php no diretório /Library/WebServer/Documents com o conteúdo abaixo, porque durante a instalação nós iremos fazer alguns testes.
Sources, libs and so on…
Será necessário baixar os fontes do PHP no site oficial e também instalar algumas libs, que eu instalei com o homebrew, mas que creio que você possa instalar usando o macports ou compilar na mão; Eu precisei da libpng e pcre.
Próximos passos
Crie o seguinte diretório caso não exista: sudo mkdir /usr/local/src e descompacte os fontes do PHP dentro dele: sudo tar -xvf ~/Downloads/php-5.4.0.tar.bz2
Sempre quando vamos compilar o PHP, nós precisamos informar alguns parâmetros de compilação, o que eu usei foi esse:
Após executar este comando, digite make e depois sudo make install.
Pronto, se tudo correu bem, o PHP foi compilado com sucesso.
Reinicie seu Apache e teste acessando o arquivo teste.php no seu browser preferido: sudo apachectl restart
Vamos instalar mais algumas coisas?
Eu gosto sempre de instalar a libmcrypt, mas ela eu instalei na mão mesmo por causa do phpize e tal, eu não sei se há alguma maneira de fazer isso usando o homebrew, então neste caso eu achei um excelente blog post explicando como fazer.
Alguns detalhes importantes: No blog post supracitado ele usa uma versão mais antiga do PHP, considere sempre a versão que estamos usando.
Ele fala para colocar os fontes em um diretório chamado /SourceCache, eu coloquei em /usr/local/src.
Se você chegou até aqui, é porque instalou o libmcrypt ou deixou isso pra lá, tudo bem, vamos continuar.
Outras duas extensões que eu costumo instalar são: XDebug e OAuth.
O XDebug eu não consegui instalar via pecl pois ele só instalaria se fosse em alguma versão do PHP menor que a utilizada neste tutorial, então eu baixei os fontes do repositório no github clonando o projeto dentro de /usr/local/src.
Segui as orientações do README do projeto e pronto. Seguem abaixo os comandos: