Sobre

Meu nome é Anderson Casimiro, tenho 27 anos. Sou de São Paulo - Brasil. Tenho a intenção de tornar esse blog um agregador de informações sobre tecnologia, incluindo o PHP. Como já exitem milhares de sites com os mesmos assuntos que irei tratar aqui, tentarei apresentá-los de uma maneira diferente.

Trabalho como desenvolvedor de sistemas web [não confundir 'sistema' com 'site']. Atuo na área há mais de 6 anos e pude participar dos mais variados projetos, desde simples sistemas de controle de estoque a ERP de gestão de pessoas, gerenciamento de varejo e monitoramento de trânsito. Sou adepto do PHP, mas conheço também ASP, Java, Coldfusion, além de gerenciadores de Bancos de Dados, como MySQL, Oracle e SQLServer.

Tenho alguns projetos pessoais utilizando PHP, os quais pretendo apresentar aqui quando estiverem mais maduros.

Sem mais, espero que apreciem o material e sintam-se a vontade para comentar e enviar críticas.

Dicas para um PHP mais veloz

Salve

Viu? não demorou muito para um novo artigo :D
Vou passar a vocês uma materia que peguei há algum tempo em inglês… mais abaixo coloco as referências.

Trata-se de uma lista de dicas para o desenvolvimento PHP. Aproveitem.

Leia mais »

PEAR, Webservices e DIME

Em primeiro lugar, desculpem a demora. foram longos meses sem um novo artigo. Pretendo reparar o acontecido com ótimo conteúdo para os leitores. Vamos falar neste post sobre Webservices com anexos… DIME pra ser mais específico. Junto com o assunto, introduzo o P.E.A.R. (PHP Extension and Application Repository), repositório de classes que auxiliam, e salvam a vida a maioria das vezes e que é mantido pela comunidade organizadamente. Leia mais »

BCMath - PHP fazendo contas direitinho

Salve

Não sei vocês, mas adoro o PHP. Me dá suporte a quase tudo que preciso para desenvolver bem. Um problema do PHP voltei a ver essa semana, e é até comum em algumas linguagens: erros em operações com números decimais. Como disse antes, adoro o PHP, e a solução está em uma extensão infelizmente pouco usada: a BCMath.

O problema acontece quando algum numero decimal na operação não é convertido facilmente para uma notação fracionária internamente no PHP, o que pode culminar em alguns bugs; veja o exemplo abaixo, retirado da documentação oficial:


<?
echo floor((0.1 + 0.7)*10);
?>

Isto irá exibir 7, e não 8 como esperado. o problema está não conversão para numero fracionário: o floor está recebendo 7.999999999, que resultará em 7;

Para os casos em que você necessita de precisão em números arbitrários existe a BCMath (Binary Calculator Mathematics). É uma extensão, obtida no pacote do php, geralmente habilitada por padrão. Dúvidas na instalção? deixe um comentário.

Se esta extensão estiver habilitada, você terá disponíveis as seguintes funções:

  • bcscale($precisao) - Seta o número de casas decimais (precisão) padrão para todas as funções BCMath do script
  • bcadd($n1,$n2,[$precisao]) - soma 2 números;
  • bccomp($n1,$n2,[$precisao]) - compara $n1 e $n2: se forem iguais retorna 0; 1 se $n1 > $n2, senão -1;
  • bcdiv($n1,$n2,[$precisao]) - Divide $n1 por $n2
  • bcmod($n1,$n2,[$precisao]) - Retorna o resto da divisão de $n1 por $n2
  • bcmul($n1,$n2,[$precisão]) - Multiplica $n1 por $n2
  • bcpow($n1,$n2,[$precisao]) - Retorna $n1 potência de $n2
  • bcpowmod($n1,$n2,$mod,[$precisao]) - O mesmo que bcmod(bcpow($n1,$n2),$mod), mais rápido
  • bcsqrt($n1,[$precisao]) - Retorna a Raiz Quadrada de $n1
  • bcsub($n1,$n2,[$precisao]) - Retorna $n1 - $n2

$precisao é um parâmetro opcional para todas as funções, exceto bcscale. O padrão no php.ini é 0, podendo ser alterado via ini_set, ou pelo bcscale.

Espero que esta pequena resenha sobre a BCMath seja útil (como foi pra mim… como foi… :D ) . Até a próxima.

Orientação a Objetos - parte 2

Salve

Na parte 1 falamos sobre o café com leite da Orientação a Objetos no PHP: classes, objetos, atributos e métodos. Desta vez vamos nos aprofundar mais no assunto e falar sobre herança, visibilidade e polimorfismo.

Utilizamos a herança para especializar uma determinada classe. No artigo anterior citamos os cães… imaginemos aqueles cães como cães comuns, mas precisamos descrever outro tipo: os cães de guarda, que possuem habilidades que o Max ou o Tirolez não possuem; com OO não precisamos escrever uma classe nova só para o Rush, o pastor alemão do vizinho. Extendemos a classe Cachorro original, herdando suas propriedades e métodos, e alterando o que for conveniente para a nova classe. Por exemplo: podemos dizer que o Rush, ao rosnar induza o cachorro para o qual ele faça de alvo a sentir medo, além de atribuir-lhe um novo método: morder (que originalmente, Max e Tirolez não são capazes de realizar).

Basicamente, para conseguirmos o que descrevi acima, precisamos de extender a classe Cachorro original:

class Cachorro{
//conteudo original
}
class CaoDeGuarda extends Cachorro{
function rosnar($outroCachorro){ /*novo conteúdo deste método*/}
function morder($alvo){ /*conteúdo deste método*/}
}
?>

Para que isso funcione, precisamos conhecer alguns conceitos de OOP: visibilidade e polimorfismo

Visibilidade, que citei na primeira parte, é a declaração de como serão usadas (visíveis) os atributos / métodos de uma classe; os tipos de visibilidade são private, public e protected. Private define que a entidade somente estará acessível em métodos da classe em que a mesma foi declarada. Public define que a entidade pode ser acessada tanto por métodos internos, como por processos externos. Protected é como a private, porém permite que classes filhas acessem a entidade diretamente, sem sobrescrevê-la, e sem permitir o acesso a chamadas externas ao âmbito da classe/objeto.
Geralmente não usamos muito o protected; usamos na maioria das vezes o private para os atributos e o public para os métodos, quando estamos apenas descrevendo dados.Fazemos isso para que sempre seja necessária a execução de um método para alterar o valor de um atributo, podendo assim validar o novo valor, por exemplo. No PHP5, se não definirmos a visibilidade dos métodos, eles assumem como public, assim como se declararmos os atributos com var (PHP4), para manter a compatibilidade.

Polimorfismo: conceito pelo qual entende-se que uma classe filha (extendida), pode conter um mesmo método que a classe ancestral, embora sua execução seja diferente da original, reescrevendo o método da classe pai, utilizando a mesma assinatura; esta por sua vez é a maneira como é declarado o método, sua visibilidade, número e tipo de parâmetros e tipo de retorno; como o PHP não é tipado, ou seja, não atribuímos o tipo das variáveis, podemos nos referenciar a assinatura como visibilidade e número de parâmetros de um dado método.

Para entendermos esses conceitos, ai vai um exemplo:

class A{
private $a1 = ‘1′;
public $a2 = ‘2′;
protected $a3 = ‘3′;
public function mostrar(){
echo ‘Classe A:[';
echo $this->a1;
echo $this->a2;
echo $this->a3;
echo ']<br />’;
}
}
class B extends A{
public function mostrar(){
//aqui estamos utilizando o polimorfismo para reescrever o método mostrar()
echo ‘Classe B:[';
echo $this->a2;
echo $this->a3;
echo $this->a1;
echo ']<br />’;
}
}
$a = new A;
$b = new B;
@$a->mostrar();//mostra Classe A:[123]
@$b->mostrar();//mostra Classe B:[23]
echo $a->a2;//mostra 2
echo $a->a3;//erro
echo $a->a1;//o script nao chega aqui
?>

Esse exemplo nos dá uma idéia do que acontece às propriedades com suas visibilidades definidas.

Voltando aos nossos cães, podemos dizer que a classe CaoDeGuarda é mais específica que Cachorro, sua classe-pai ou superclasse. Podem perguntar ‘Certo, mas o que a tal da visibilidade tem a ver com os cachorros?’; digo que se na parte 1 declarássemos os métodos com as visibilidades específicas, teríamos que mudar muita coisa naquele codigo, e neste, para que tudo ocorresse bem. E mais: do jeito que está agora, podemos alterar o nome do ‘Tirolez’ para ‘123testando’ a qualquer momento.
Vamos alterar as classes para ficarem mais adequadas:

class Cachorro{
private $nome;
private $raca;
private $cor;
private $peso;
private $saude;
public function __construct($n,$r,$c,$p,$s=100){
$this->nome = $n;
$this->raca = $r;
$this->cor = $c;
$this->peso = floatval($p);
$this->saude = intval($s);
}
public function latir(){ /*código que fará o cachorro latir*/ }
public function rosnar($outroCachorro){ /*código que fará o cachorro rosnar para outro */ }
public function mijar($onde){ /*código que fará o cachorro urinar em algum lugar */ }
public function dormir(){ /*código que fará o cachorro dormir e recuperar saúde*/ }
public function setSaude($novaSaude){
$this->saude = (intval($novaSaude) > 100) ? 100 : intval($novaSaude);
}
public function getSaude(){
return $this->saude;
}
}
class CaoDeGuarda extends Cachorro{
function rosnar($outroCachorro){ /*O CaoDeGuarda faz o outroCachorro amedrontar-se*/ }
function morder($alvo){
$saudeOriginal = $alvo->getSaude();
$saudeDepoisDaMordida = $saudeOriginal*0.9;//o alvo perde 10% da saúde a cada mordida
$alvo->getSaude($saudeDepoisDaMordida);
}
}
?>

Bom, podemos fazer a mesma brincadeira da parte 1:

$rush = new CaoDeGuarda(’Rush’,'Pastor’,'Preto/Bege’,50);
$ralf = new Cachorro(’Ralf’,'Fox Paulistinha’,'Preto/Branco’,12);
$ralf->rosnar($rush);//ralf, com seus 30 cm de bravura e estupidez…
$rush->rosnar($ralf);//agora ele viu o tamanho da encrenca;
while($ralf->getSaude() > 50){
$rush->morder($ralf);
}
//sim, gastamos uma boa grana com o veterinário

Assim encerramos esta parte. Na próxima falarei sobre abstração, métodos estáticos, interfaces e mais. Até lá

Voltando…

Salve

Depois de muito tempo eis que tento novamente me aventurar nas linhas do blog… tive uns probleminhas com o antigo host e agora estou postando da conta do wordpress.com. Estou estudando bastante coisa e em breve já haverão novos artigos aqui. Aguardem…

Orientação a Objetos - parte 1

Muitos falam, outros têm como utopia, outros entendem e outros nunca ouviram falar (na área de TI isso é bem improvável, mas não podemos ignorar tal possibilidade). A verdade é que muitos ‘endeusam’ um conceito até simples…
Orientação a Objetos é um conceito, um paradigma de programação. É interpretar no software entidades da vida real, ou problemas da vida real. Olhe para os lados, para a frente: tudo o que você vê, e não vê (tempo, por exemplo); tudo isso pode ser interpretado em software.
Provavelmente nesse momento você está à frente de um monitor… imagine o que é um monitor: suas características e suas funcionalidades. Se pensarmos que um monitor pode ser colorido (ou não), tem marca, modelo, taxa de atualização, tipo (lcd/crt/plasma), brilho, contraste, nível de cor, etc… são características, substantivos, adjetivos: atributos. Esse monitor pode ligar-se, desligar-se, ajustar o brilho, o contraste, o nível de cor… são ações, verbos, ou métodos. Já estamos chegando no conceito de classe

Classe: é a definição, em software OO, de todos os atributos e métodos que servirão para ser a base de um objeto. Pensando num exemplo mais ‘vivo’, imagine um software de controle de cães.Nesse software teremos vários cachorros, e o objetivo é fazê-los interagir entre si. Teremos cães.. uma matilha… se dissermos que nesse programa a entidade mais genérica é um Cachorro, podemos dizer que temos algo assim:

Cachorro:
a::nome
a::raca
a::cor
a::peso
a::saude
m::Cachorro
m::latir
m::rosnar
m::mijar
m::dormir

Isto seria uma maneira de descrever o que é e o que faz um Cachorro, dentro do contexto do nosso software. É um exemplo bem simples, e foge de um exemplo devidamente arquitetado, que nos próximos capítulos da nossa jornada será melhor esclarecido, mas para fins didáticos vai nos servir como uma luva.
onde coloquei ‘a::’ é um atributo e onde tem ‘m::’ é um método. Como atributos temos nome, raca, cor, peso, saude e como métodos Cachorro, latir, rosnar, mijar, dormir. O método ‘Cachorro’ pode parecer estranho, mas é fundamental na criação de entidades OO: esse seria nosso método Construtor; o Construtor é responsável pela inicialização do objeto criado; adotando nosso exemplo de Cães, seria como ‘parir’ um Cachorro P ; Quando inicializamos um objeto, preenchemos suas variáveis e podemos fazer alguns testes já, para que o objeto tenha consistência na sua informação.
Bom… e em PHP, como faríamos?

class Cachorro{
$nome;
$raca;
$cor;
$peso;
$saude;
function __construct($n,$r,$c,$p,$s=100){
$this->nome = $n;
$this->raca = $r;
$this->cor = $c;
$this->peso = floatval($p);
$this->saude = intval($s);
}
function latir(){ /*código que fará o cachorro latir*/ }
function rosnar($outroCachorro){ /*código que fará o cachorro rosnar para outro */ }
function mijar($onde){ /*código que fará o cachorro urinar em algum lugar */ }
function dormir(){ /*código que fará o cachorro dormir e recuperar saúde*/ }
}

Note que este código não declara uma ‘function’ (método) Cachorro, mas sim um __construct. No PHP5 foram acrescentados ao modelo OO alguns métodos mágicos, como é o exemplo de __construct; se usássemos Cachorro não apresentaria erro algum, por razões de compatibilidade com o PHP4 - que aliás apresentaria erro por outro motivo: não colocamos a palavra chave ‘var’ antes dos atributos, algo que não é obrigatório no PHP5. Em vez disso foi adicionada à linguagem noções de visibilidade, que serão estudadas melhor numa possível ‘parte 2′, junto com os conceitos de herança.

Bom… com esta classe declarada, podemos criar cães no nosso sistema:

/* Supomos que a classe cachorro esteja declarada, in-code ou por include/require */
$max = new Cachorro(’Max’,’Vira-lata’,’branco’,10);//inicializo o Cachorro Max, que por sinal vive lá em casa P
$tiro = new Cachorro(’Tirolez’,’Yorkshire’,’marrom’,6);//inicializo o Cachorro Tirolez, que também habita por lá
$tiro->mijar(’Casa do Max’);//Tirolez apronta uma das suas na casinha do Max
$max->latir();//Max lógico, late…
$max->rosnar($tiro);//Max rosna ‘furioso’ para o Tirolez…
/* algum tempo depois, eles se cansam… */
$max->dormir();
$tiro->dormir();

Conclusão: $max e $tiro são instâncias da classe Cachorro, ou seja… OBJETOS. Lembra do que falei dos monitores lá em cima? esse que está na sua frente é um objeto da classe Monitor, por exemplo. Classe é o ‘conceito’ do que pode vir a ser um objeto!

Bom, essa é a primeira parte dessa série… tentei fazer uma abordagem diferente, até porque artigos sobre isso você encontra aos milhares… No nosso próximo artigo veremos outro conceito importante em OO: herança.

Até lá

SimpleXML

XML é uma linguagem de notação, baseada em tags, para mantermos informação de maneira uniforme, flexível, organizada e legível. Simples e descomplicada é o formato ideal para troca de informação entre diferentes sistemas. Exemplos de uso: webservices, RSS, Podcasts, Configuração de sistemas, arquivos de troca de informação simples, etc…

SimpleXML é uma funcionalidade embutida no PHP5, que visa trabalhar, de maneira simples, XML no PHP. Trabalhando numa estrutura de ojetos, é bem fácil trabalhar com ele:
Para começar vamos a um pouco de código:

$sxe = simplexml_load_file(’teste.xml’);

Supondo que teste.xml Seja um xml válido, $sxe receberá uma instância de SimpleXMLElement, referente ao nó raiz do xml; caso contrario receberá false.

Você pode adionar elementos com addChild, e attributos com addAttribute, como a seguir:

$ne = $sxe->addChild(’novo_elemento’);
$ne->addAttribute(’novo_atributo’,’valor_do_novo_atributo’);

Note que addChild retorna uma referência ao novo elemento criado.

A informação no SimpleXML é editada facilmente:

$sxe->elemento[0]->descendente = ‘dado textual do descendente’;
$sxe->elemento[0][’atributo_do_elemento’] = ‘novo valor do atributo’;

Os atributos de SimpleXMLElement são os elementos descendentes da tag raiz do xml, respeitando sua hierarquia. Esses elementos podem ser acessados via Array de índíce numérico nos atributos do objeto. Agora falando dos atributos do xml: estes são aceesados por arrays de índice textual.
Para exportar as edições feitas para o xml, usa-se o método asXML:

$sxe->asXML();

Simples não? O SimpleXML ainda permite importação de Elementos DOM do php, além de pesquisas com XPath. Só peca por não conte métodos de remoção de elementos.
SimpleXML foi tema de minha apresentação na última PHP Conference Brasil ‘06. Você pode ver a apresentação em Apresentação SimpleXML - PHPConf ‘07

__autoload()::Santa função

Quem trabalha com PHP sabe o parto que é ficar incluindo os arquivos com as classes da sua aplicação, que se não estão bem estruturadas em pastas/diretórios/pacotes torna-se tudo uma bagunça. Se você trabalha centralizando as requisições em um arquivo para ai rodar os diferentes scripts dos seu projeto e não quer ficar incluindo todas os arquivos de classes em cada programa que faz eis a solução: __autoload(). Segue a descrição do PHP.net para esta belezura:

Muitos desenvolvedores ao desenvolver aplicações orientadas a objeto criam um arquivo PHP para cada definição de classe. Um dos maiores contratempos é ter de escrever uma longa lista de includes no início de cada script(um include para cada classe necessária).

Com PHP 5 isso não é mais necessário. Você pode definir uma função __autoload que é automaticamente chamada no caso de você tentar usar uma classe que ainda não foi definida. Ao chamar essa função o ’scripting engine’ tem uma última chance para carregar a classe antes que o PHP falhe com erro.

Digamos que você tenha um arquivo “index.php”. Onde voce faria:(lógico, supondo que suas classes estejam em “/classes/”)

<?
include_once(”classes/User.class.php”);
include_once(”classes/Store.class.php”);
include_once(”classes/Book.class.php”);
$oUser = new User();
$oStore = new Store();
$oBook = new Book();
?>

Com o autoload você faz assim:

<?
function __autoload($class_name) {
require_once(”classes/”. $class_name . “.class.php”;
}
$oUser = new User();
$oStore = new Store();
$oBook = new Book();
?>

E todos seus objetos serão instanciados como se com o include/require no script.

Vamos além… sou um cara muito preguiçoso, e tenho classes em 3 pastas: “domain”,”engine” e “util”:

<?
$sep = PATH_SEPARATOR
set_include_path(get_include_path() . “$sep./domain/$sep./engine/$sep./util/”);
function __autoload($className){
include($className . “class.php”);
}
$oUser = new User();
$oStore = new Store();
$oBook = new Book();
?>

Viu como é bom ser preguiçoso? até a linguagem apóia! Lógico que é muito bom ter um controle de “o que é incluído quando”, mas às vezes temos que utilizar certas coisas do tipo pra facilitar nossa vida.

PHP - Começando

PHP - História: lá pros idos de 1995, Rasmus Lerdorf criou um conjunto de funcionalidades para seus projetos que chamou de Personal Home Pages. A coisa evoluiu, chegando ao “PHP2″.
Algum tempo depois Zeev Zuraski e Andi Gutmans abraçaram o projeto: criaram uma empresa para cuidar profissionamente do PHP, a Zend, e refizeram a base da linguagem, a agora Zend Engine; o significado de PHP também mudou: PHP Hypertext Preprocessor. Lançaram o PHP3, que rapidamente estourou como linguagem de programação para a web. Isto evoului e chegamos ao PHP4 com significativas mudanças na maneira como o PHP trabalha com a Zend Engine.
Em 2005 foi lançada a versão 5 da linguagem, que trouxe a Orientação a Objetos como maior destaque na evolução. Hoje o PHP é a linguagem mais utilizada na internet, com grandes comunidades e “seguidores”, inclusive este que vos escreve.

Bom, o que precisamos então para utilizar o PHP como linguagem de programação? vamos à receita de bolo:

  • Servidor Web
  • PHP
  • Browser

Só explicando os itens: Servidor Web Software que irá “servir” arquivos sob requisições do protocolo de internet (HTTP); dentre os mais comuns estão o Apache, IIS, Xitami, etc. O PHP será executado no servidor assim que este receber uma requisição, tratando-a e devolvendo ao navegador. O procedimento de instalação não é o foco deste artigo, porém não é nada do outro mundo.

Supondo que você já tenha seu servidor web rodando, você terá uma pasta que será a Raiz, ou seja, de onde o servidor irá começar a buscar arquivos (algo como o “C:/” para o windows). Esta pasta no windows pode ser c:\inetpub\wwwroot\ para o IIS ou c:\htdocs no caso do apache; no linux as distribuições baseadas em Debian geralmente criam por padrão a \var\www para este propósito
Para se criar um pequeno programa em PHP, crie um arquivo novo com o nome de “artigo.php” nesta pasta raiz. Abra-o e insira o seguinte código:

<?
echo “Olha só, escrevi no navegador”;
?>

Abra seu navegador, entre no endereço “http://localhost/artigo.php” [não esqueça o http://] e voilá

Concluindo: este artigo foi só uma apresentação rápida sobre o PHP, e como rodar um script simples. Em outro artigo explico como se começa a programar em PHP. Duvidas? a parte de comentários está ai pra isso

Próxima Página »