Escolar Documentos
Profissional Documentos
Cultura Documentos
Phpoo Mostra
Phpoo Mostra
Pablo DallOglio
Novatec
Captulo 1
Introduo ao PHP
Ao longo deste livro utilizaremos diversas funes, comandos e estruturas de controle bsicos da linguagem PHP, que apresentaremos neste captulo. Conheceremos
as estruturas bsicas da linguagem, suas variveis e seus operadores e tambm um
conjunto de funes para manipulao de arquivos, arrays, bancos de dados, entre
outros.
20
37
else
{
}
O mesmo cdigo poderia ser escrito em uma nica linha da seguinte forma:
$resultado = ($valor_venda > 100) ? 'muito caro' : 'pode comprar';
1.6.2 WHILE
O WHILE uma estrutura de controle similar ao IF. Da mesma forma, possui uma condio
para executar um bloco de comandos. A diferena primordial que o WHILE estabelece
um lao de repetio, ou seja, o bloco de comandos ser executado repetitivamente
enquanto a condio de entrada dada pela expresso for verdadeira. Este comando
pode ser interpretado como ENQUANTO (expresso) FAA {
comandos
... }.
.
A Figura 1.3 procura explicar o fluxo de funcionamento do comando WHILE. Quando
a expresso avaliada como TRUE, o programa parte para a execuo de um bloco de
comandos. Quando do fim da execuo deste bloco de comandos, o programa retorna ao ponto inicial da avaliao e, se a expresso continuar verdadeira, o programa
continua tambm com a execuo do bloco de comandos, constituindo um lao de
repeties, o qual s interrompido quando a expresso avaliada retornar um valor
falso (FALSE).
58
boot
home
A diferena que todo contedo contido dentro de aspas duplas avaliado pelo PHP.
Assim, se a string contm uma varivel, esta varivel ser traduzida pelo seu valor.
<?php
$fruta = 'ma';
Tambm podemos declarar uma string literal com muitas linhas observando a
sintaxe a seguir, na qual escolhemos uma palavra-chave (neste caso, escolhemos CHAVE)
para delimitar o incio e o fim da string.
<?php
$texto = <<<CHAVE
Aqui nesta rea
echo $texto;
?>
Resultado:
Aqui nesta rea
64
No exemplo a seguir, a funo strpos() vasculha a varivel $minha_string para encontrar em qualquer posio dentro dela a varivel $encontrar:
<?php
else
{
}
?>
Resultado:
String encontrada na posio 14
Captulo 2
Orientao a objetos
2.1 Introduo
Neste captulo abordaremos a implementao da orientao a objetos, seus diversos
conceitos e tcnicas das mais diversas formas, sempre com um exemplo ilustrado de
cdigo-fonte com aplicabilidade prtica. Ao final do captulo tambm abordaremos
dois assuntos importantes: a manipulao de erros e a manipulao de arquivos
XML. Antes de mais nada, no entanto, iremos rever os principais conceitos da programao estruturada.
86
91
Captulo 2
Orientao a objetos
Conta
Agencia, Codigo,
DataDeCriacao, Titular, Senha, Saldo e se est Cancelada, bem como so seus mtodos (fun-
Pessoa.class.php
<?php
class Pessoa
{
var $Codigo;
var $Altura;
var $Nome;
var $Idade;
var $Nascimento;
var $Escolaridade;
var $Salario;
/* mtodo Crescer
108
Visibilidade
Descrio
private
protected
public
117
Captulo 2
Orientao a objetos
echo "=============================:\n";
Aplicacao::Sobre();
?>
Resultado:
Informaes sobre a aplicao:
=============================:
Fornecedor.class.php
<?php
class Fornecedor
{
var $Codigo;
var $Endereco;
?>
var $RazaoSocial;
var $Cidade;
150
definida por set_error_handler() como sendo a funo a ser invocada quando algum
erro ocorrer. Dentro desta funo (que recebe o arquivo e a linha em que ocorreu o
erro, alm do nmero e a mensagem de erro ocorrido) podemos exibir ou suprimir
a exibio do erro, grav-lo em um banco de dados ou gravar em um arquivo de log,
como fizemos no exemplo demonstrado. No exemplo, todas as mensagens (ERROR,
WARNING e NOTICE) so armazenadas em um arquivo de log; somente as de WARNING e
ERROR so exibidas na tela, e as de ERROR causam parada na execuo da aplicao pelo
comando die. A desvantagem deste tipo de abordagem que concentramos todo
tratamento de erro em uma nica funo genrica, quando muitas vezes precisamos
analisar caso a caso para optar por uma determinada ao.
Mtodo
Descrio
getMessage()
Captulo 3
Manipulao de dados
154
159
Resultado:
1 - rico Verssimo
2 - John Lennon
3 - Mahatma Gandhi
4 - Ayrton Senna
5 - Charlie Chaplin
6 - Anita Garibaldi
7 - Mrio Quintana
Banco
String de conexo
SQLite
FireBird
MySQL
new PDO('sqlite:teste.db);
Postgres
new PDO('pgsql:dbname=example;user=user;password=senha;host=localhost);
new PDO('mysql:unix_socket=/tmp/mysql.sock;host=localhost;port=3307;
dbname=livro, 'user, 'senha);
171
186
TSqlInsert.class.php
<?php
/*
* classe TSqlInsert
* Esta classe prov meios para manipulao de uma instruo de INSERT no banco de dados
*/
/*
* mtodo setRowData()
if (is_string($value))
// adiciona \ em aspas
$value = addslashes($value);
$this->columnValues[$column] = "'$value'";
204
connection.php
<?php
/*
* funo __autoload()
function __autoload($classe)
{
if (file_exists("app.ado/{$classe}.class.php"))
{
include_once "app.ado/{$classe}.class.php";
210
e exatamente por isso que estamos utilizando o controle de transaes. Caso ocorra
algum erro na primeira execuo, automaticamente uma exceo lanada e a aplicao direcionada para o bloco catch, ignorando as demais instrues.
Na Figura 3.17 procuramos demonstrar como a interao entre as classes participantes de uma transao. Veja que o programa abre uma transao executando o
mtodo open() da classe TTransaction. Este mtodo, por sua vez, executa o mtodo open
da classe TConnection, obtendo um objeto de conexo PDO, e armazena-o na propriedade esttica $conn. Sempre que o programa quiser essa varivel de conexo, ele ir
executar o mtodo esttico get(), que retornar a conexo da transao ativa. De posse
da varivel de conexo (objeto $conn), o programa poder enviar diversas consultas ao
banco de dados por meio do mtodo query(). Ao final, quando desejarmos finalizar
a transao, executaremos o mtodo close() da classe TTransaction, que, por sua vez,
eliminar o objeto PDO, atribuindo NULL varivel de conexo.
transaction.php
<?php
/*
* funo __autoload()
function __autoload($classe)
{
if (file_exists("app.ado/{$classe}.class.php"))
{
include_once "app.ado/{$classe}.class.php";
Captulo 4
Mapeamento Objeto-Relacional
No captulo anterior revemos como se d a manipulao de dados em bases relacionais com PHP por meio da utilizao da linguagem SQL. Tambm criamos uma
API orientada a objetos para manipulao de dados. Agora podemos subir um nvel
de complexidade e pensar em nossa aplicao como um conjunto de objetos que
o nosso modelo conceitual. Quando trabalhamos com um conjunto de objetos,
precisamos persistir estes objetos na base de dados, ou seja, armazen-los e permitir
posterior recuperao. Pensando nisso, estudaremos as tcnicas mais utilizadas para
persistncia de objetos em bases de dados relacionais, assim como criaremos uma API
orientada a objetos que ir permitir que faamos tudo isso de forma transparente,
sem nos preocuparmos com os detalhes internos de implementao.
4.1 Persistncia
4.1.1 Introduo
De modo geral, persistncia significa continuar a existir, perseverar, durar longo tempo
ou permanecer. No contexto de uma aplicao de negcios, na qual temos objetos
representando as mais diversas entidades a serem manipuladas (pessoas, mercadorias,
livros, clientes, arquivos etc.), a persistncia significa a possibilidade de esses objetos
existirem em um meio externo aplicao que os criou, de modo que esse meio deve
permitir que o objeto perdure, ou seja, no deve ser um meio voltil. Os bancos de
dados relacionais so o meio mais utilizado para isso (embora no seja o nico). Com
o auxlio de mecanismos sofisticados especficos de cada fornecedor, esses bancos de
221
226
230
A vantagem deste pattern sobre o anterior reside no fato de que cada tabela contm somente os campos relativos ao seu contexto, diferentemente do Single Table
Inheritance, no qual temos campos irrelevantes que podem ficar vazios.
A dificuldade em implementar este pattern reside no fato de que o objeto nico na
memria, independente se ele um Livro ou DVD, ele faz parte da mesma hierarquia de
classes e os objetos devendo ser tratados com unicidade tambm no banco de dados.
Dessa forma, temos de ter cuidado para que o ID no fique duplicado nas tabelas, ou
seja, para que no exista na tabela livro um registro com um ID que exista na tabela
dvd, e vice-versa. A unicidade no ID deve ser estendida para o universo das duas tabelas e no somente para uma. Imagine uma tela em que o usurio pode selecionar
qualquer tipo de material, seja Livro ou DVD. Adotando essa estratgia, teramos de
realizar duas consultas ao banco de dados (uma para cada tabela) ou usar um join,
agrupando os resultados em uma nica consulta. Neste caso, fica mais claro ainda a
necessidade de no termos IDs que se repetem entre as tabelas.
257
= $objeto->estoque*2;
Resultado:
INSERT INTO Produtos (id, descricao, estoque, preco_custo) VALUES ('1', 'Vinho Cabernet', '10', '10')
INSERT INTO Produtos (id, descricao, estoque, preco_custo) VALUES ('2', 'Salame', '20', '20')
SELECT * FROM produtos where id='2'
UPDATE produtos set descricao = 'Salaminho Italiano', estoque = '40', preco_custo = '20'
WHERE id = '2'
DELETE FROM produtos where id='1'
288
Um Repository utiliza outros patterns j vistos neste livro, como o Query Object
(classes TSqlInstruction/TCriteria). O seu funcionamento inicia pela definio de algum critrio de seleo de objetos ($criteria->add(new TFilter('idade, '>, 20))) por
parte do programador (Programa). Este, ento, passa o critrio para o Repository por
meio de algum mtodo (obter coleo, remover coleo, contar elementos etc.), sendo
que esses mtodos atuam sobre uma coleo de objetos que satisfazem os critrios
definidos, alterando-os ou retornando-os. Na Figura 4.23 vemos o funcionamento
de um Repository Pattern.
TRepository.php
<?php
/*
* classe TRepository
Captulo 5
Apresentao e controle
Aquele que conhece os outros sbio; mas quem conhece a si mesmo iluminado! Aquele
que vence os outros forte; mas aquele que vence a si mesmo poderoso! Seja humilde e
permanecers ntegro.
Lao-Ts
5.1 Introduo
Se voc programa em alguma linguagem para web h algum tempo, j deve ter percebido o quanto a exibio de tags HTML deixa o cdigo confuso e pouco legvel
quando temos de concatenar expresses que mesclam cdigo HTML e variveis da
aplicao PHP.
Ao longo deste captulo criaremos alguns componentes de apresentao, como
imagens e textos, e alguns contineres para exibir tabelas, painis e janelas, alm de
alguns componentes de controle, como dilogos de mensagem e controladores de
pgina de forma orientada a objetos.
O objetivo das classes que desenvolveremos justamente o de substituir a utilizao de tags presentes no cdigo HTML pela utilizao dessas classes e seus mtodos,
312
314
TElement.class.php
<?php
/**
* classe TElement
class TElement
{
private $name;
/**
// nome da TAG
private $properties;
// propriedades da TAG
* mtodo construtor
= nome da tag
327
TImage.class.php
<?php
/**
* classe TImage
private $source;
/**
* mtodo construtor
// localizao da imagem
parent::__construct('img');
$this->src = $source;
?>
5.2.3.1 Exemplo
No exemplo a seguir, exibiremos, por meio da utilizao da classe recm-criada, duas
imagens na tela. Mostraremos primeiro o logotipo do gnome (gnome.png) e depois o
logotipo do gimp (gimp.png), resultando na pgina exibida pela Figura 5.9.
338
}
$celula= $linha->addCell('Total');
$celula->colspan = 3;
$celula = $linha->addCell($total);
$celula->bgcolor = "#a0a0a0";
$celula->align
= "right";
// exibe a tabela
$tabela->show();
?>
344
painel.php
<?php
include_once 'app.widgets/TStyle.class.php';
include_once 'app.widgets/TElement.class.php';
include_once 'app.widgets/TPanel.class.php';
include_once 'app.widgets/TImage.class.php';
include_once 'app.widgets/TParagraph.class.php';
// instancia novo painel
5.3.3 Janelas
Uma janela pop-up uma janela que se abre sobre a janela principal da aplicao,
geralmente sem muitas opes e de tamanho reduzido, para exibir algumas informaes como o resultado de uma operao, uma mensagem ao usurio, um formulrio
de dados, uma propaganda, dentre outros. Entretanto, abrir janelas uma prtica no
muito bem aceita no ambiente web, e a maioria dos navegadores de ltima gerao
j conta com ferramentas de bloqueio para abertura de janelas pop-up.
Apesar disso, interessante termos disponvel esse recurso sempre que quisermos
dar um destaque maior para um evento que ocorre. Para contornar esta situao, uma
das formas de continuar exibindo uma janela para o usurio simular a abertura de
uma janela utilizando uma camada <div> com um boto de fechar (para esconder a
352
window.php
<?php
/*
* funo __autoload()
function __autoload($class)
{
}
include_once("app.widgets/{$class}.class.php");
$janela2->add(new TImage('app.images/gimp.png'));
$janela2->show();
372
include_once "app.widgets/{$classe}.class.php";
No exemplo a seguir, estamos fazendo uso da classe TMessage para exibir a mensagem de erro ao usurio Agora eu estou falando srio. Este erro fatal! , como visto
na Figura 5.31.
message_error.php
<?php
function __autoload($classe)
{
if (file_exists("app.widgets/{$classe}.class.php"))
{
include_once "app.widgets/{$classe}.class.php";
Captulo 6
Formulrios e listagens
Uma sociedade s ser democrtica quando ningum for to rico que possa comprar
algum e ningum for to pobre que tenha de se vender a algum.
Jacques Rousseau
Neste captulo iremos nos concentrar em alguns dos componentes que esto entre
os mais utilizados na maioria das aplicaes: formulrios e listagens. Utilizamos formulrios para as mais diversas formas de entrada de dados na aplicao, seja para a
insero de novos registros, para definio de preferncias do sistema ou para definir
parmetros para filtragem de um relatrio, dentre outros. Utilizamos listagens para
exibir os dados da aplicao, seja para simples conferncia, em relatrios ou ainda
possibilitando a edio e excluso de registros. Neste captulo criaremos componentes
que visam facilitar a implementao de formulrios e listagens de forma orientada
a objetos.
6.1 Formulrios
Um formulrio um conjunto de campos dispostos ao usurio de forma agrupada
para que este os preencha com informaes requisitadas pela aplicao. Um formulrio
composto por campos de diversos tipos como caixas de digitao, radio buttons
e combo-boxes, alm de possuir botes de ao, os quais definem o programa que
processar os dados. Em uma aplicao temos interfaces de entrada de dados, rotinas
de processamento e interfaces para apresentao de dados. Podemos dizer que os
formulrios dominam amplamente as interfaces de entradas de dados em aplicaes,
portanto imprescindvel dominarmos o seu uso e tambm simplificarmos ao mximo para ganharmos maior produtividade no desenvolvimento.
377
385
Classe
Descrio
TEntry
TPassword
type=text>.
TFile
THidden
TCombo
TText
type=file>.
type=hidden>.
TCheckButton
TCheckGroup
TRadioButton
TRadioGroup
type=checkbox>.
Acima de todas estas classes listadas anteriormente, teremos a classe TField. Tal
classe ir prover a infra-estrutura bsica e comum a todo campo de um formulrio,
ou seja, aquelas operaes bsicas que todo elemento de um formulrio dever oferecer, como mtodos para alterar seu nome, seu valor e seu tamanho. Veja a seguir
um exemplo de formulrio contendo as classes que sero criadas.
A classe responsvel por montar o formulrio ir encapsular os elementos anteriormente listados. Para isso, criaremos a classe TForm, que poder conter, por meio
de uma estrutura de agregao, qualquer elemento derivado da classe TField. Veja a
seguir o diagrama de classes resumido.
399
formA.php
<?php
/*
* funo __autoload()
422
form1.php
<?php
/*
* funo __autoload()
function __autoload($classe)
{
if (file_exists("app.widgets/{$classe}.class.php"))
{
include_once "app.widgets/{$classe}.class.php";
// instancia um formulrio
= new TEntry('nome');
$titulo
= new TEntry('titulo');
= new TEntry('email');
445
462
list2.php
<?php
/*
* funo __autoload()
function __autoload($classe)
{
if (file_exists("app.widgets/{$classe}.class.php"))
{
include_once "app.widgets/{$classe}.class.php";
private $datagrid;
parent::__construct();
$nome
$codigo
= new TDataGridColumn('codigo',
= new TDataGridColumn('nome',
'Cdigo',
'Nome',
'left',
'left',
'Fone',
50);
180);
140);
'center', 100);
Captulo 7
Criando uma aplicao
Quando morremos, nada pode ser levado conosco, com a exceo das
sementes lanadas por nosso trabalho e do nosso conhecimento.
Dalai Lama
Ao longo desta obra, criamos uma srie de classes para automatizar desde a conexo
com banco de dados, transaes, persistncia de objetos e manipulao de colees
de objetos, at a criao de formulrios, listagens, tabelas e aes, dentre outros. Ao
longo de cada captulo procuramos dar exemplos da utilizao de cada classe e agora
chegou o momento de utilizar este conhecimento para construir algo maior, uma
aplicao completa. Para isso, estudaremos formas de organizar e estruturar esta
aplicao, como o padro MVC e Web Services.
477
498
no exista, ento poder ser cadastrado, como acontece na tabela de cidades. Veja na
Figura 7.7 nosso Modelo Entidade Relacionamento.
A venda um caso parte. A empresa pode realizar inmeras vendas, para clientes
diferentes e em datas diferentes. Portanto, precisaremos armazenar para qual cliente
a venda foi realizada e em qual data. Tambm poderemos armazenar o valor total da
venda e tambm o valor pago, caso tenha sido concedido algum desconto. Uma venda
composta de produtos. Em uma venda, podem ser vendidas quantidades diferentes
de produtos. Portanto faz-se necessria a criao de uma tabela para armazenar quais
foram os produtos que participaram de uma determinada venda. Para isso, criaremos
a tabela item, na qual cada item corresponde a um produto que fez parte de uma
venda. Nessa tabela ainda teremos a quantidade vendida de cada item, alm, claro,
das chaves estrangeiras para cada tabela.
7.2.2.1 Modelo
O nosso registro de cidade ser apenas uma extenso da classe TRecord, no oferecendo nenhum novo mtodo. S utilizaremos os mtodos bsicos para armazenar o
registro no banco de dados (store), excluir (delete) e carregar (load). A classe de modelo
CidadeRecord ser armazenada na pasta app.model.
500
CidadesList.class.php
<?php
/*
* classe CidadesList
private $form;
/*
private $datagrid;
// listagem
* mtodo construtor
// formulrio de cadastro
parent::__construct();
// instancia um formulrio
$this->form->add($table);
$codigo
= new TEntry('id');
$estado
= new TCombo('estado');
$items= array();
550
7.2.7.2 Aplicao
Nosso programa de emisso do relatrio de vendas ser muito simples. Ser composto
basicamente de um formulrio, no qual o usurio ir preencher duas datas: a data
inicial e a data final. O programa dever pesquisar na base de dados todas as vendas
realizadas entre esses dois perodos e montar o relatrio em tela. Veja na Figura 7.19
o relatrio de vendas.
Nossa pgina ter ento um formulrio com dois campos do tipo TEntry (data_ini
e data_fim). O formulrio ter tambm o boto de ao Gerar Relatrio que est vinculado execuo do mtodo onGera(), o qual tem como funo ler o intervalo de
datas e montar o relatrio em tela.
RelatorioForm.class.php
<?php
/*
* classe RelatorioForm
private $form;
/*
// formulrio de entrada
* mtodo construtor
/*
* mtodo conv_data_to_br()
function conv_data_to_br($data)
{
$mes = substr($data,5,2);
555
$ano = substr($data,0,4);
$dia = substr($data,8,4);
return "{$dia}/{$mes}/{$ano}";
?>
564
uma interface enxuta, que encapsula uma srie de chamadas a mtodos e objetos da
aplicao servidora, por um meio remoto.
Do lado cliente da aplicao, teremos a classe NovoCliente, que na verdade uma
janela GTK (GtkWindow). Esta janela disponibiliza alguns campos para preenchimento
do usurio. Quando este terminar de preencher esses campos e clicar no boto Salvar,
o mtodo onSaveClick() ser executado, instanciando um objeto da classe SoapClient, que
realiza a conexo com o servidor SoapServer, de modo que ser executado o mtodo
handle() que ir despachar a chamada ao mtodo correto no lado do servidor, que
neste caso o mtodo salvar().Veja na Figura 7.24 a estrutura da aplicao.