Tag Archive for 'php'

Ramblings on PHP and IDE’s

PHP: milhões de utilizadores, centenas de ambientes, 1 IDE semi-oficial.

Perspectivas sobre o PHP são tantas como os developers: cada um de nós tem um portfolio diferente de experiências com outras linguagens, cada um de nós estabelece relações com a linguagem, consoante as rotinas diárias adquiridas, os tipos de projectos, os workflows, e até mesmo as ferramentas utilizadas.

Além do mais, a linguagem é evolutiva e todos podemos sonhar… Eu me atenho a uma linguagem, mas apenas enquanto estou a trabalhar com ela. Hum… e maior parte do tempo estou! Há um trabalho de design que até pode ser feito a papel e caneta, ou whiteboard, mas depois vem o trabalho de testar/programar, passado no IDE.

Sim o IDE é o nosso amigo fiel, e a linguagem essa paixão a quem tudo perdoamos. E passamos imenso tempo juntos. E não é de férias numa ilha. Não, é mesmo a trabalhar e à procura de resultados.

Já para não falar de que muitas vezes uso o próprio IDE como ferramenta de design… e aí passo todo o clico de vida do projecto a trabalhar com ele (IDE) e ela (linguagem)… à procura dos nomes dos membros… o que pode ser um pesadelo quando estás a escrever unit cases ou fazer refactoring… e não és o kung-master-fu-jedi-god-freekin-father do editor de texto.

Eu acho que um bom casamento ele/ela dá qualidade de vida e faz crescer. Para mim é indispensável para um trabalho produtivo, … como eu concebo, claro.

Para essa integração, contribui tanto o IDE que entrega funcionalides ao developer, como a linguagem que as define. Como o artesão que em cima disso os interpreta.

Nota: o meu IDE de eleição é o Eclipse PDT.

Type cast in PHP: doing the trick beyond the language

Following my last two posts (in portuguese, here and here) about class juggling in PHP I started getting some google hits on “cast class in PHP”.

A couple of days after I just have to duh! myself in the head a couple of times for whining about it and not thinking around the problem: I found a really simple, quick and dirty solution.

Click para continuar a ler “Type cast in PHP: doing the trick beyond the language”

5 expressões regulares (html, url e email incluídos)

Eu sou incrivelmente nhurro quanto toca a aprender expressões regulares. Mais ainda a memorizar as syntaxes. O que me vale é a incrível quantidade de recursos que se encontram.

Este artigo explica bem 5 casos, típicos, frequentes.

  • Validar um username: duh!
  • encontrar um tag xhtml: ah!
  • encontrar um tag xhtml com certo atributo: ui!
  • validar e partir um email: claro!
  • validar e partir uma url: idem!

E funcionam.

Como diz no artigo, 5 expressões regulares que qualquer programador deve saber.

Ou saber encontrar quem saiba.

Uma vantagem do type-cast em PHP seria fazer mais EAFP e menos LBYL

Note:for English readers hitting this post: written in Portuguese, about a non-existing feature (variable class type cast) of php5, bith 5 and 6, and one good-argument on how it would improve the language.

UPDATE: check this post for a “solution” to class cast in PHP.

No meu post anterior referi-me a uma característica do PHP que eu vejo como uma limitação, no sentido que limita - acima de tudo - a performance do meu trabalho no dia-a-dia.

Click para continuar a ler “Uma vantagem do type-cast em PHP seria fazer mais EAFP e menos LBYL”

Limitações do PHP: verdadeiro type cast

Note:for English readers hitting this post: written in Portuguese, about a non-existing feature (variable class type cast) of php5, bith 5 and 6, and one good-argument on how it would improve programming efficiency through ide improved functionality.

UPDATE: check this post for a “solution” to class cast in PHP.

Escrevo este post como verdadeiro fã do PHP. Mas não como aquele que se limita a louvar as suas potencialidades, antes como aquele que gostava que o PHP evoluísse e se tornasse ainda mais poderoso.

Click para continuar a ler “Limitações do PHP: verdadeiro type cast”

PHP UnitTesting com SimpleTest

Estou a usar o SimpleTest há já mais de um ano, mas nunca tinha verdadeiramente puxado por ele. Agora, que estou a juntar as peças da minha framework, preciso de actualizar os testes por forma a levar o projecto 100% até o próximo nível: test now, code later.

Neste momento, as classes que constituem o core e a base dos controladores (o C do MVC), estão 100% testadas. Claro que nem todos os testes passam ainda, but that’s not the point here…


$test->addTestCase(new test_OE_Base());
$test->addTestCase(new test_OliveConfig());
$test->addTestCase(new test_OliveMessage());
$test->addTestCase(new test_OliveStorageDefault());
$test->addTestCase(new test_OliveLocatorDefault());
$test->addTestCase(new test_OliveLoaderDefault());
$test->addTestCase(new test_OliveExecutorDefault());
$test->addTestCase(new test_OliveConfiguratorDefault());
$test->addTestCase(new test_OliveConfigurableBase());
$test->addTestCase(new test_OliveComponentBase());
$test->addTestCase(new test_OliveExecutableBase());
$test->addTestCase(new test_OliveModuleBase());
$test->addTestCase(new test_OliveControlBase());
$test->addTestCase(new test_OliveFrameworkBuilderBase());
$test->addTestCase(new test_OliveApplicationFactoryBase());

São já 447 testes e ainda falta testar/escrever todas as componentes de Output (V) e Model (M)… Ah! Recordo-me agora que quando eu era substancialmente mais novo as noitadas de sábado eram substancialmente mais divertidas.

Olive Framework tests with SimpleTest

Acerca do SimpleTest

Quando avaliei as frameworks de teste para PHP escolhi o SimpleTest por implementar todas as features (e mais um par de botas) e, ao mesmo tempo, permitir escrever testes com um código, de facto, muito simples.

Entre outras funcionalidades, o SimpleTest permite gerar Mocks em run-time e configurá-los para agir como actores (retornar valores consoante os argumentos) e críticos (testar chamadas e argumentos). Eis um exemplo:


  /**
   * should call given strategies and return as soon as some strategy returns data
   */
  public function test_load_specific_strategy()
  {
    // create
    $configurator = OliveConfiguratorDefault::instance();

    // create mock strategy
    $strategy1 = new MockOliveConfigStrategy();
    $strategy1->expectNever('load');

    // create mock strategy
    $strategy2 = new MockOliveConfigStrategy();
    $strategy2->expectOnce('load', array($this->_path, $this->_name));
    $strategy2->setReturnValue('load', $this->_data);

    // create mock strategy
    $strategy3 = new MockOliveConfigStrategy();
    $strategy3->expectNever('load');    

    // pass mocks
    $configurator->add_strategy($this->_strategy[0], $strategy1);
    $configurator->add_strategy($this->_strategy[1], $strategy2);
    $configurator->add_strategy($this->_strategy[2], $strategy3);       

    // load with specific strategy
    $data = $configurator->load($this->_path, $this->_name, $this->_strategy[1]);

    // assert data
    $this->assertIdentical($data, $this->_data);
  } 

Ainda mais á frente, permite também fazer Web Testing, scraping, navegação, submissão de forms e autenticações. Digo mais à frente porque, apesar do mecanismo ser claro como a água, ainda não consigo pensar em estratégias eficazes para implementar testes desta natureza. Mas lá chegarei.

Mas o SimpleTest tem outras características de ganhador: está relativamente bem documentado, principalmente com exemplos que te possibilitam estar up and running em menos 10 minutos; tem uma comunidade bastante activa (mailing list); a versão que está cá fora é 1.0.1, ou seja, para lá do Beta; o desenvolvimento está bastante activo e os planos são claros no que toca a levar o SimpleTest ao colo até ao php6.

A versão que eu estou a usar é um pouco antiga e foi hacked para permitir testar se durante a execução dos testes houve ou não output para o browser. Por isso ainda não o actualizei para a última versão e ainda não experimentei o plugin para o Eclipse que promete um nível de integração porreiro com o PDT e o XDebug.

As falácias da crise de migração para PHP6

Nos últimos tempos, os artigos alarmistas acerca da próxima versão do PHP multiplicam-se pelos blogs como memes em tardes de inércia generalizada. (oops…)

A tónica assenta invariavelmente numa suposta crise de migração. O cenário é muitas vezes colocado como apocalíptico, qual y2k bug, que vai deixar milhões de sites sem funcionar, developers em sarilhos, empresas de alojamento em encruzilhadas e, no w.c.s. vai provocar uma debandada geral de programadores que deixarão o PHP despido do seu maior capital, a maior comunidade mundial de web-develop… err… web-program… err.. web-mast…. err… enfim, pessoas.

PHP6 é polémico!? Por favor…

PHP 6, já agora aproveitem para mudar o logo!Basta dar uma olhada pelos resultados da pesquisa “PHP6″ no Google. Para variar das language flame-wars agora temos uma migration flame-war dentro da própria comunidade.

Para não variar, existe muita falta de esclarecimento. É isto a que os developers do python se referem quando dizem que a comunidade PHP tem uma má relação sinal/ruído. Mas primeiro vou desmontar o argumento mais falacioso das opiniões mais catastróficas.

Retro-compatibilidade = mudança lenta

Uma mudança de versão implica mudanças. Duh! E ninguém se atreve a colocar em causa que as mudanças são para melhor. O que está em causa é a retro-compatibilidade com características que estão diagnosticadas há quase 10 anos como pecados originais do PHP.

O PHP5 saiu há séculos (4 anos!) e ainda existem milhões de sites alojados em PHP4, com register_globals e magic_quotes, um legado do PHP3 que deveria ter sido eliminado antes do “famoso” 3.23. mas que na verdade ainda pode ser usado no 5.

A recompensa para esta política populista de manter hordas de fiés proprietários do PhpBB (v1) a funcionar “sem problemas” é dada pelos próprios. São eles que se preocupam com as notícias de que o register_globals vai desaparecer porque na verdade terão que migrar do 3 para o 6.

Além de mais de nada adiantou manter a retro-compatibilidade com o PHP4. Não só o se 5 manteve poluído com uma infinita quantidade de hacks herdados do 4, como existem ainda pessoas a utilizar as ingénuas funcionalidades do 3.

E em toda a verdade, nem sequer há razão para alarme. Ou seja…

O hosting e as versões paralelas

Há um ano atrás vi-me forçado a escrever mails para conseguir um hosting PHP5 em Portugal por um preço razoável! Relembro que o 5 saiu há quase 4 anos e que apesar do suporte que a própria comunidade continua a dar à migração para o 5, muito continua por fazer. Mesmo sabendo-se que o PHP4 foi descontinuado no final de 2007, a oferta de alojamento em PHP4 continua aí, a vender-se que nem ginjas.

Portanto sosseguem. A questão não está na linguagem mas sim nos alojamentos. Irá acontecer com o PHP6 o mesmo que aconteceu com o PHP5. E com o MySQL5.1 e as transacções e o INNODB e a integridade referencial… Que continuam a ser uma miragem, ou mesmo um mistério, para muitas pessoas.

As empresas de alojamento, com dezenas ou centenas de máquinas, disponibilizarão serviços com o 6 ao lado das existentes com o 5. E entretanto mantêm o 4 até não haver mais clientes que justifiquem manter o último dinossauro a sugar corrente do bastidor.

Para não falar das que ainda nem sequer descobriram o 5. Hey guys, how about this?.

Quanto aos “utilizadores”, apesar dos quatro piscas, cinco cintos e três retrovisores serem hoje utilitários que o bom-senso não dispensa, quem não tiver disponibilidade para trocar o velho Fiat127 por um Uno pode sempre invocar que o primeiro é um clássico e assim evitar umas multas.

Mas não os condeno de todo, são utilizadores e não developers. Não podem é ser voz activa no que ao futuro do PHP diz respeito. Além do mais recomendo vivamente que questionem se circulam em segurança e se gastar 11 litros aos 100 realmente compensa.

Mas afinal o que significa migrar para o PHP6?

Chutando a bola para a frente, gostava acima de tudo de esclarecer o seguinte: aparentemente muitos dos posts que circulam na net desde o início de 2008 baseiam-se numa wishlist de Rasmus Lerdorf publicada aqui em 2005… Afinal foi o próprio que utilizou, com alguma infelicidade, a palavra “controversial”.

Mas ninguém deveria pronunciar-se sobre o assunto antes de ler a minuta da reunião dos core developers tida alguns meses mais tarde em Paris. E já agora, porque não consultar o wiki de desenvolvimento do próprio PHP e olhar para a lista TODO PHP6 e, consoante a orientação, ficar preocupado ou aliviado por haver ainda tantas questões em aberto.

E as questões já fechadas, o que implicam?… Desculpem, mas não vou de todo publicar um YAP6MMG (yet another php6 migration mini guide) quando existem artigos como este disponíveis.

Desilusão

Afinal a montanha pariu um rato. Isso sim é polémico! A migração é banalíssima (excepto para os que migram directo do PHP3) e no que toca a verdadeiras novidades deixa muito a desejar.

Deixou de lado alguns pedidos interessantes, como adicionar suporte para type hinted class properties, delegates, o construto try {} finally {} e object casting to primitive types, advogando que “isto não é o PHP way” ou “viola o princípio KISS do PHP” ou “existe uma função para esse efeito” ou simplesmente “não queremos fazer isto”. Por outro lado introduz novos hacks que por si só davam matéria para muitos artigos.

Eu continuarei a aplicar a regra de ouro que me tem posto a salvo de úlceras e complicações nervosas: take it as it comes. Afinal o PHP é open-source. E gratuito. E os alojamentos são mesmo muito baratos.

Introduzindo Olive, mais uma Framework MVC para PHP

Acabei de publicar o primeiro exemplo de uma aplicação implementada sobre a minha framework MVC, o Olive.

Porquê escrever uma framework? Porquê chamar-lhe Olive? Essas respostas já estão na (parca) documentação que coloquei no wiki. Mas posso adiantar que Olive é algo muito português, que reporta às origens beirãs da minha família (também válido para outros portugueses, desde algarvios a transmontanos). E também que é divertido ter componentes da aplicação que se chamam OliveTree ou OliveField.

olivedemoapplication.jpg

A framework está em rápido desenvolvimento e conto ter uma versão 1 totalmente documentada até ao final de 2008. Quem se interessar pelo assunto pode entrar em contacto comigo, porque a Olive precisa de alguma ajuda.

Posso-vos dizer que é um projecto interessante, por esta e aquela razão, mas sou suspeito. Vejam por vocês mesmos.

Para já apenas as layers de Controlo e Output estão verdadeiramente funcionais e os exemplos publicados são parcos, mas já mostram algumas das características interessantes do projecto, tais como flexibilidade (output por smarty ou old schoool, configuração por xml, yaml ou db, ajax por html, json ou xml), modularidade (controls, modules, components, widgets), performance (uma obsessão) e sintaxe produtiva (pelo menos divertida).

Quanto à camada dos dados, o M do MVC, está a sofrer um refactor verdadeiramente intestinal: no original a class central (OliveConnection) foi desenvolvida como Singleton para facilitar o acesso aos métodos de carregamento das definições de tabelas, views, procedures, etc… tipo:

$res = OliveConnection::table('blog')->row($id);

Burrice, porque isso não permitia fazer várias ligações, ligações a bases de dados diferentes por exemplo. Enfim… agora o acesso passará a ser feito através de um método estático na class da aplicação, que retorna uma conexão por pedido (ou a conexão primária por defeito)

// conexão primária (primeira a ser criada)
$res = OliveApp::connection()->table('blog')->row($id);
// chamar conexão por nome
$res = OliveApp::connection('remote')->table('blog')->result();

ou

// criar query SELECT sobre tabela/view "blog"
$res = OliveApp::connection()->select('blog')
  // escolher campos
  ->fields('data', 'titulo', 'texto', 'autor.nome AS autor_nome')
  // filtrar
  ->where_equals('categoria_id', $cat_id)
  // ordenar
  ->orderby('data DESC')
  // limitar
  ->limit(10);

Também planeio implementar no próximo sprint artefactos como “embrulhar” os resultados das querys numa class que implemente a interface Iterator (PHP5) para permitir

// cool
foreach($res as $row) { ... }

// em vez de old school
while($row = $db->fetch_row($res)) { ... }

Mas antes disso, actualizar a documentação.

Certificação PHP practice exam #1

Hoje lá tirei algum tempo para fazer o primeiro dos cinco testes de prática (ver post anterior acerca de como iniciar o processo de certificação Zend, vulgo ZCE).

Resultados do teste prático zend

Motivante? Nem por isso. Não gostei muito de algumas perguntas que me foram colocadas.

Click para continuar a ler “Certificação PHP practice exam #1″

Obter a certificação PHP5

Becoming a Zend Certified Engineer

Desenvolvo em PHP desde o PHP3, ou seja, há mais de 10 anos. Não é tarde nem é cedo: vou fazer a certificação PHP5 da Zend.

Click para continuar a ler “Obter a certificação PHP5″







Close
E-mail It
1