Author Archives: Adler Medrado

About Adler Medrado

Adler Medrado é o fundador do getOnCode, ele é desenvolvedor poliglota.

Podcast – Episódio #6

Está no ar o sexto episódio do getOnCode podcast e nele eu falei sobre:

  • PHP 5.4.0

    http://php.net/ChangeLog-5.php

  • Windows 8
  • Vagrant

    http://vagrantup.com/

  • Nide

    http://coreh.github.com/nide/

  • Ace

    http://ace.ajax.org/

  • Zend Framework 2

    http://framework.zend.com/zf2/blog/entry/Zend-Framework-2-0-0beta3-Released

Thanks to http://www.podcastthemes.com/ for the music theme.

Principais novidades do PHP 5.4.0

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:

$arrExemplo = array('ivo', 'viu', 'a', 'uva');

Ou também podemos criar definindo os índices:

$arrExemplo = array(0 => 'ivo', 1 => 'viu', 2 => 'a', 3 => 'uva');

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:

$arrExemplo = array('pessoas' => array('João', 'José', 'Mané'));

Com a nova sintaxe:

$arrExemplo = ['pessoas' => ['João', 'José', 'Mané']]

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.

<?php

include 'LerArquivo.php';
include 'EscreverArquivo.php';

class Arquivo {
	use LerArquivo;
	use EscreverArquivo;
}
?>



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.

<?php
class Base
{
	public function ler($arquivo) {
		echo 'Método ler definido na classe Base';
	}
	
	public function escrever($arquivo, $conteudo) {
		echo 'Método escrever definido na classe Base';
	}
	
}

?>

É 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:

<?php
trait LerArquivo {
	public function ler($arquivo) {
		parent::ler($arquivo);
		echo "Lendo o arquivo {$arquivo}";
	}
}
?>

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.

<?php

include 'LerArquivo.php';
include 'EscreverArquivo.php';
include 'Base.php';

class Arquivo extends Base {
	use LerArquivo, EscreverArquivo {
		LerArquivo::salvar insteadof EscreverArquivo;
	}
}
?>

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.

<?php
trait LerArquivo {
	public function ler($arquivo) {
		parent::ler($arquivo);
		echo "Lendo o arquivo {$arquivo}";
	}
	
	public function salvar() {
		echo 'Salvando na trait LerArquivo';
	}
	
	private function abrir() {
		echo 'metodo abrir na classe LerArquivo';
	}
	
}
?>

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:

<?php
trait TraitArquivo {
	use LerArquivo, EscreverArquivo;
}
?>

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:

<?php
trait LerArquivo {
	public function ler($arquivo) {
		parent::ler($arquivo);
		echo "Lendo o arquivo {$arquivo}";
	}
	
	public static function checaAlgumaCoisa() {
		echo 'Metodo estatico definido na trait';
	}
	
	abstract public function salvar();
}
?>


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.

<?php
trait LerArquivo {
	
	private $nome = 'config.ini';
	
	public function ler($arquivo) {
		parent::ler($arquivo);
		echo "Lendo o arquivo {$arquivo}";
	}
}
?>

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.

Espero que o post tenha sido útil, até o próximo.

Compilando o PHP 5.4 no Mac OS X Lion

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.

<?php
phpinfo();
?>

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:

./configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --sysconfdir=/private/etc --with-apxs2=/usr/sbin/apxs --enable-cli --with-config-file-path=/etc --with-libxml-dir=/usr --with-openssl=/usr 
--with-kerberos=/usr --with-zlib=/usr --enable-gd-native-ttf --with-icu-dir=/usr --with-iodbc=/usr 
--with-ldap=/usr --with-ldap-sasl=/usr --with-libedit=/usr --enable-mbstring --enable-mbregex --enable-bcmath 
--with-bz2=/usr --enable-calendar --enable-soap --enable-sockets --enable-sysvmsg --enable-sysvsem 
--enable-sysvshm --with-tidy --enable-wddx --with-xmlrpc --with-iconv-dir=/usr --with-xsl=/usr 
--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql-sock=/var/mysql/mysql.sock 
--with-readline=/usr --enable-shmop --with-snmp=/usr --with-curl=/usr --enable-dba --enable-exif --enable-ftp 
--with-gd --with-freetype-dir=/usr/X11/ --with-jpeg-dir=/usr/X11/ --with-png-dir=/usr/X11/ --enable-zip 
--with-pcre-regex=/usr --with-pgsql=/usr --with-pdo-pgsql=/usr

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:

#clonando o projeto para /usr/local/src
cd /usr/local/src
git clone https://github.com/derickr/xdebug

#acessa o diretório com os fontes
cd xdebug

#roda o phpize
phpize

# Execute os demais comandos para compilação
./configure --enable-xdebug
make

#copia o modulo compilado para o diretório onde encontram-se as extensões do PHP
cp modules/xdebug.so /usr/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so

#adicione ao php.ini que se encontra em /etc/php.ini
zend_extension="/usr/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so"

#reinicie o apache
sudo apachectl restart

Instalando OAuth

Vamos instalar usando o pecl: pecl install oauth

Após a compilação, adicione ao php.ini:

[oauth]
extension=”/usr/lib/php/extensions/no-debug-non-zts-20100525/oauth.so”

Reinicie o apache novamente: sudo apachectl restart
Se o conteúdo mostrado for parecido com os screenshots abaixo, tudo funcionou corretamente.

Phpinfo 1
Phpinfo 2
Phpinfo 3
Phpinfo 4

É isso pessoal. Na minha máquina pelo menos, assim funcionou legal.

Resenha: Zend Framework na prática

Se você deseja aprender a usar o Zend Framework ou quer ter um guia de referência que vai direto ao ponto ao invés de confundi-lo, como o próprio manual do Zend Framework faz em certos casos, você deve obrigatoriamente ler este livro.

O e-book é disponibilizado nos formatos epub, mobi e pdf, ou seja, você pode ler em qualquer dispositivo, por exemplo, no meu mac eu li ele em PDF e no iPad eu li no formato ePub.

O Elton Minetto conseguiu demonstrar, usando uma linguagem simples e direta os principais componentes do Zend Framework por meio da implementação de um projeto de blog que abrange desde a definição do projeto, modelagem dos dados e criação de wireframe até a codificação total do projeto.

Os componentes abordados estão sem dúvida entre os mais utilizados no dia-a-dia de um desenvolvedor que utiliza o Zend Framework, dê uma olhada no conteúdo:

- Introdução
- Instalando o Zend Framework
- – Definindo o projeto
- – Modelagem
- – Estrutura do projeto
- – Configurando o Apache
- Bootstrap
- Controladores
- Modelos
- – Trabalhando com modelos e queries
- Layout e visões
- Formulários
- – Enviando arquivos
- – Herança de formulários
- – Subforms
- Criando um CRUD
- – Desafio
- Organizando a aplicação
- Roteamento
- Autenticação
- Controle de acesso
- Navegação
- Paginação
- Cache
- Traduções
- Enviando e-mails
- Diagnóstico da aplicação
- – Zend_log
- – Zend_Db_Profiler
- Conclusão

Existem alguns componentes do ZF e algumas técnicas que por incrível que pareça, muitos desenvolvedores não tem o costume de usar e que o Elton abordou muito bem em seu livro, entre elas estão o Roteamento, Zend_Db_Profiler, Zend_Paginator e herança de formulários criados com o Zend_Form, então, agora não tem mais desculpa porque tais funcionalidades e técnicas estão muito bem explicadas.

Outro ponto que considero importante destacar é o uso constante do Zend Tool, ferramenta de linha de comando que facilita a criação de controllers, models, actions, etc., pois eu conheço diversos programadores que não tem o hábito de utiliza-la.

Os exemplos com Zend_Auth, Zend_Acl, Zend_Translate e Relacionamento entre tabelas usando Zend_Db_Table, são muito claros; Na verdade todos os exemplos do livro são claros e eu estou me atendo a comentar somente aqueles que eu costumo ver que as pessoas possuem mais dificuldades no entendimento.

Eu aprecio muito este tipo de abordagem direta e prática, eu sempre tento explicar as coisas dessa maneira por ser adepto da filosofia “Talk is cheap, show me the code“.

Para finalizar, eu recomendo este livro a desenvolvedores experientes que querem um guia de refererência poderoso e simples e também a aqueles interessados em aprender a usar esta ferramenta e deixo meus parabéns ao Elton pelo ótimo trabalho.

Saiba mais sobre o livro visitando o site oficial.

Chegou o final do ano

A primeira etapa do getOnCode e mais uma das etapas de nossas vidas está se concluindo, mais um ano está passando e espero que você tenha atingido seus objetivos.

Eu desejo que você que você encontre paz, sucesso, felicidade e tudo aquilo que deseja; Que continue tendo forças para trilhar seus caminhos com fé e perseverança nos dias que virão.

Nesses três meses de vida foi feito o possível para que o getOnCode trouxesse informação que pudesse ser útil a desenvolvedores e profissionais de TI em geral. 

Apesar do curto tempo de existência, conseguimos atingir os objetivos e estamos confiantes de que em 2012 (antes do mundo acabar, claro) o getOnCode continuará seguindo seu caminho e quebrando outras barreiras.

Você, amigo do getOnCode é especial. Feliz Natal e um excelente ano novo.

Abraços,

Adler Medrado