Domingo, Junho 24, 2007

O objeto não pode estar aberto a tudo.

Mais uma salve a todos,

Ha algum tempo trabelhei numa empresa onde conheci uma pessoa, que nesta empresa ela, trabalhava com entre outras coisa o Java e certa vez ela fez uma observação que um objeto em PHP poderia iniciar com um atributo e no decorrer de sua vida ele poderia ir adquirindo vários outros e que no Java isso não era possível, de fato o PHP tem disso, e de fato isso não desejável e outro de fato é que ele tinha razão, mas e o PHP evolui e isso é uma consante. Para enteder melhor o que estou tentando externar, vai um exemplo:
  1. <php
  2. class Foo{ }

  3. $f = new Foo();
  4. $f->nome = "João Roberto";
  5. echo $f->nome;
  6. ?>

  7. saída: João Roberto.
Este comportamento, inadequado ao meu ver se dá devido ao PHP ter sua verificação relaxada ou seja ele verifica se é um objeto, mas se o atributo existe ou não para ele tanto faz. Na verdade não existir ele criará em run-time. Mas nem sempre isso é desejável. queremos uma forma de dizer ao PHP que se o atributo existir ele atribua o valor informado a este, porém, se não existir ele lance um SuperNomeGrandeParaDefinirQueAlgoNãoEstaCertoException. Nossa!

  1. <php
  2. class Foo{
  3. public $nome;
  4. public function __set( $nomeAtributo, $valorAtribtuo ){
  5. if( isset( $this->$nomeAtributo ) )
  6. $this->$nomeAtributo = $valorAtribtuo;
  7. else
  8. throw new Exception( "Error: O atributo: {$nomeAtributo} não existe." );
  9. }
  10. }

  11. $f = new Foo();
  12. $f->nomes = "João Roberto";
  13. ?>
O método mágico __set é executado imediatamente antes de uma atribuição de valor a um atributo. Isso possibilitará a verificação se tal atributo existe ou não. Pausa para as apresentações:

void __set ( string name, mixed value )

Onde void é retorno, ou seja, não retorna nada. string name é o nome do atributo que está sendo informado e por fim mixed value é o valor que está sendo atribuido para este atributo.

. . .continuando . . .

Com isso a gente força o PHP a não aceitar qualquer coisa, afinal, ele não é nem de longe é parente do ponto( . ) das Expressões Regulares.

Em nosso próximo encontro estaremos vendo sobrecarga de métodos.
Até Lá.

2 comentários:

jardel disse...

achei sua resposta uma ótima saída, pois pelo tempo q conheço php considero uma liguagem dinâmica e flexível, e não acharia necessário o php lançar um tratamentoDeExcessãoDesseTamanhoQueNenhumProgramadorIaEnteder, já que no código da classe o mínimo que deveria ser feito era a verificação da existência do atributo, conforme o exemplo citado, no qual consideraria uma boa prática de programação na plataforma.

zecah disse...

Tipo esta forma tem vantagens e desvantagens.. eu ja enxergo com uma vantagem, porem se vc desejar fazer como fava faz so utilizar o conceito de cosnt e private pubic... entaum nao vejo muitos problemas....