terça-feira, dezembro 17, 2013

Restringindo a criação de atributo dinâmico em PHP

Muita gente não gosta de uma característica existente em PHP que permite a definição de atributos dinâmicos em objeto. Esta prática de fato frusta aos programadores menos experientes e aos veteranos causa, no mínimo, um pouco de trabalho para organizar a "casa".

Tal característica pode ser evitada se aplicado um pouco de organização. A organização referida trata-se na verdade em criar uma hierarquia de classes com uma super classe base e tomar o cuidado, por assim dizer, de todos os demais objetos descendam de uma classe filha da classe base.

Mas Augusto, você está propondo que seja criando uma super classe para todo um sistema? Exatamente!

Muitos programadores, principalmente PHPs, se assustam com esta idéia. Pior, por vezes não conseguem visualizar como fazer ou vislumbrar os benefícios desse tipo de abordagem. Mas isto ficará para um post futuro, por hora, vamos nos concentrarmos no assunto de hoje: Restringir a definição de atributos dinâmicos.

Restringir a criação de atributos dinâmicos pode ser feito com o uso do método __set (documentação). Este método recebe exatamente dois parâmetros e é executado sempre que uma tentativa de atribuir um valor qualquer a um atributo do objeto for realizada.

O fragmento de código abaixo demonstra a atribuição dinâmica.

# definição da classe Foo
class Foo {}

# instancia de Foo
$foo = new Foo;

# atributo dinâmico 
$foo->bar = 'value';

var_dump($foo);

// saída: object(Foo)#1 (1) { ["bar"]=> string(5) "value" } 

Agora apliquemos a restrição da definição dinâmica.

# definição da classe Foo
class Foo {
    public function __set ($name, $args)
    {
       return;
    }
}

# instancia de Foo
$foo = new Foo;

# atributo dinâmico 
$foo->bar = 'value';

var_dump($foo);

// saída: object(Foo)#1 (0) { }


Note que no segundo fragmento de código o atributo bar não foi criado, ao contrário do primeiro.

Como pode ser observado, definir o método __set para cada classe torna o trabalho inviável e é nesse ponto que entra o uso da hierarquia mencionada  acima.

abstract class Base
{
    public function __set ($name, $args)
    {
       return;
    }
}

# definição da classe Foo
class Foo extends Base
{
}

# instancia de Foo
$foo = new Foo;

# atributo dinâmico
$foo->attr = 'value';

var_dump($foo);

// Saída: object(Foo)#1 (0) { }

Com isso qualquer objeto oriundo de uma classe filha de Base não permitirá a definição de um atributo que não tenha sido explicitamente definido na classe referente ao objeto.

segunda-feira, dezembro 16, 2013

O que esperar ao se estudar PHP para concurso

Recentemente me interessei pela área do concurso público(CP) e como sou programador PHP há muito tempo me veio à mente que esta seria uma matéria que não precisaria estudar, certo? Não exatamente.

O problema de se estudar para CP é que nele não é cobrado o que é usado no dia a dia. Se não é cobrado o que fazemos no cotidiano, então o que é?

Na verdade é cobrado as nunces do cotidiano, coisas que deixamos passar com muita facilidade ou que desprezamos por completo, por achar que não tem importância, mas que para a Banca é o que vai distinguir um profissional do outro.

Então, como disse sou programador PHP de longa data e, inicie uma série de vídeos PHP <lista de vídeos> com dois propósitos: 1 - Treinar meus conhecimentos na linguagem, e; 2 - Ajudar aqueles que estão iniciando ou não está prestando atenção nas "nunces" das questões.

Assim, espero que possa lhe ajudar em algo e vamos em frente.

sexta-feira, setembro 10, 2010

svn rollback

Devido a política de desenvolvimento da empresa em que trabalhei, Vox(www.voxtecnologia.com), alterações de códigos existente(correções de modo geral) só podem sem gravadas no “branch” do projeto, porém,  aconteceu de algumas alterações ter sido gravadas no “trunk” o que fatalmente acarretará em conflito no momento do “merge” entre o “brach” e “trunk”.

Em busca de um "svn rollback" vi que a coisa não era tão simples quanto esperava, pois para executar esta tarefa é necessário efetuar, ao menos, dois passos:

1: Obter as revisões afetadas pela(s) gravação(ões) que ser(ão) revertida(s)
2:  e,  efetuar o rollback propriamente dito

Um terceiro passo, que na verdade seria um intermediário entre o 1º e o 2º passo, mas não obrigatório, seria a verificação dos arquivos afetados pela mudada.

Para exemplificar vamos usar um repositório fictício “foo” de endereço local /var/svn/foo, ou se preferir, remove: http://localhost/svn/foo
 

passo-a-passo:

criando um copia de trabalho:
# svn co http://localhost/svn/foo/trunk
 
Entre na pasta criada pelo checkout cima:
# cd trunk

Obtendo as alterações no repositório:
# svn log

-- output --
------------------------------------------------------------------------
r8 | augustowebd | 2010-09-09 11:03:41 -0300 (Thu, 09 Sep 2010) | 1 line

[MERGE] -estabilizacao do da 'tag.1.0.0a'
------------------------------------------------------------------------
r4 | augustowebd | 2010-08-26 10:32:27 -0300 (Thu, 26 Aug 2010) | 2 lines

[ADD]
 - carga inicial do trunk
------------------------------------------------------------------------
r3 | root | 2010-08-26 10:31:42 -0300 (Thu, 26 Aug 2010) | 1 line

configuracao inicial
------------------------------------------------------------------------
-- output --

Com isso podemos saber exatamente o que foi alterado no repositório, assim, supondo que o erro ocorreu ao efetuar o MERGE, na revisão 8 "r8 | augustowebd |", o comando para reverter a alteração ficaria:

# svn merge -r:3:4 http://localhost/svn/foo/trunk

terça-feira, maio 11, 2010

Fotos Ensol

Conforme prometido, estou disponibilizando todas as [fotos] que tirei no Ensol.

quinta-feira, maio 06, 2010

1º dia Ensol 4ª edição


A primeira edição do PHP-NE verdadeiramente abriu a 4ª edição do ENSOL, realizado em Ponta do Seixas na Paraíba[1], falar que este lugar é bonito chega ser um pleonasmo, poís bem, chegamos ao evento as 9.45hs( Bruno “Porkaria”, Ricardo[2] e Eu ) e fomos em busca de informações sobre credenciamento, local de palestra, etc,. No ínicio foi um pouco truncado, mas logo tudo se resolveu e fomos para o local.
A palestra foi iniciada com certa de 20 ou 30 congrecistas, devido ao atraso no redenciamento ocasionado pelo sistema ou a falha do mesmo, o Ricardo fez a abertura do PHP-NE e em seguida o Porkaria falou um pouco e logo depois me passou a palavra.
Falei exatos 55mins sobre XDebug no eclipse(XDebug e Eclipse) para uma platéia[3] extremamente atenta ao que eu falava algumas interações no decorrer da palestra e ao final algumas dúvidas, normal.
Após o almoço veio abetura oficial do evento onde estavam presentes ninguém mais ningém menos do que Jon "maddog" Hall falando sobre o projeto “Cauã” e na platéia, ao meu lado Rasmus concentrado em seu notebook, acho que no twitter.
Após a abertura oficial do ENSOL fomos para 3ª palesra do PHP-NE que abordou noSQL e depois a 4ª e última palestra sobre Drupal, aos 45mins do Rasmus entra no auditório e senta ali no quanto tranquilamente e começa assistir a palestra sobre o Drupal. Finalizada a apresentação fizemos um breve encerramento e todos os presentes fomos tirar fotos ao lado do criado do PHP, bom demais!
E fomos para o PHPinga acompanhado de Rasmus Lerdorf[4].


Chegada ao Ensol
Ricardo, Bruno "Porkaria" e alguém tem de tirar a foto.
Palestra sobre XDebug no EclipsePDT

Augusto e Rasmus Lerdof.

PHPinga histórico.

Palestra ENSOL 2010 - Paraíba

A recepção dos Paraibanos ao 1º PHP-NE não poderia ser melhor, o auditório ficou completamente lotado para assitir minha palestra sobre XDebug e eclipsePDT.




Entrada da Estação Ciência no credenciamento



Palestra XDebug

quarta-feira, abril 14, 2010

Ensol - PHP e muito Sol

Salve galera,

Uma notícia para os amantes do PHP:

"De 6 a 9 de maio de 2010 na Estação Cabo Branco em João Pessoa, acontecerá o Ensol que conterá com a presença de ninguém mais ninguém menos que Rasmus Lerdorf".

continuando...

"O projeto Eclipse PDT é uma esforço da comunidade em manter uma verão gratuíta do eclipse capaz de desenvolver códigos PHP, porém, alguns dos recursos encontrado no Zend Studio, versão mantida pela Zend Tecnologia sob o eclipse, como um debugador interno não vem por padrão no PDT.


Visto a necessidade e utilidade de debugar o código ainda em seu ambiente de desenvolvimento, esta palestra tem por objetivo apresentar o Eclipse PDT e XDebug e integrá-los para que possam ser usados em conjuntos".

será com esta palestra que abrirei o ENSOL 2010.


até lá!

segunda-feira, novembro 09, 2009

Removendo .svn

De quando em vez tenho a necessidade de remover todos os diretórios de controle do svn, os famigerados ".svn", isso seria tarefa fácil se o projeto fosse pequeno, porém, alguns projetos chegam a gerar centenas desses.

Então a ideia é realiazar uma pesquisa num dados diretório em busca dos tais ".svn" e para cada ocorrência executar o "rm -rf" passando a ocorrência encontrada como argumento para xargs.

   $ find . -iname .svn | xargs rm -fr

 Note que foi usado '-iname' ao invés de '-name' para ignorar diferenciação entre maiscula e miniscula.

    find . -iname .svn: Encontra todos os diretórios ".svn"
    xargs rm -rf: O xargs é o programa que executa o que vier depois dele pra cada linha recebida como argumento.


Uma forma alternativa sem uso do xargs:

   $ find . -iname .svn -exec rm -rf {} \;


 Claro que você pode evitar a criação destes diretórios simplismente dando um:

    svn export DESTINO

Mas se eles já existirem fica a dica.
Outra coisa é que basta você trocar o nome do diretório que se deseja excluir e a dica é válida do mesmo jeito.

[]'