Escolar Documentos
Profissional Documentos
Cultura Documentos
Licenciamento de Uso
PHP Avanado
ndice
Captulo 1 Programao Orientada a Objetos...............................................
Classes e objetos...................................................................................
Herana .......................................................................................
Mtodo construtor e destrutor................................................................
Encapsulamento....................................................................................
Interfaces...............................................................................................
Classes abstratas...................................................................................
Palavra-chave 'final'...............................................................................
Mtodos e propriedades estticas..........................................................
Mtodos mgicos....................................................................................
Captulo 2 Manipulao de arquivos texto.....................................................
Captulo 3 Simple XML...................................................................................
Captulo 4 Templates com POO......................................................................
4
5
6
7
9
12
14
16
18
20
29
35
45
PHP Avanado
Captulo 1
Programao Orientada
Objetos (POO) com PHP
A orientao objetos uma maneira de programar que modela os
processos de programao de uma maneira prxima realidade, tratando a cada
componente de um programa como um objeto, com suas caractersticas e
funcionalidades. O tratamento de objetos no PHP 5 foi totalmente reescrito,
permitindo a utilizao de uma maior quantidade de recursos da POO, melhor
performance e mais vantagens na implementao deste tipo de programao.
A POO tambm possibilita uma maior otimizao e reutilizao do cdigo.
PHP Avanado
1. Classes e Objetos
Classe a estrutura mais fundamental para a criao de um objeto. Uma
classe nada mais do que um conjunto de variveis (propriedades ou atributos) e
funes (mtodos), que definem o estado e o comportamento do objeto. Quando
criamos uma classe, temos como objetivo final a criao de objetos, que nada
mais so do que representaes dessa classe em uma varivel. Para declararmos
uma classe, utilizamos a palavra-chave class. Nosso exemplo ser com a classe
Noticia:
Exemplo 1.1 Classe Noticia:
<?php
# noticia.class.php
class Noticia
{
public $titulo;
public $texto;
function setTitulo($valor)
{
$this->titulo = $valor;
}
function setTexto($valor)
{
$this->texto = $valor;
}
function exibeNoticia()
{
echo "<center>";
echo "<b>". $this->titulo ."</b><p>";
echo $this->texto;
echo "</center><p>";
}
}
$not = new Noticia;
$not->titulo = 'Novo curso de PHP Avanado';
$not->texto = 'Este curso contm os seguinte tpicos: POO, XML, etc.';
$not->exibeNoticia();
?>
PHP Avanado
1.1 Herana
Herana uma forma de reutilizao de cdigo em que novas classes so
criadas a partir de classes existentes, absorvendo seus atributos e
comportamentos, e complementando-os com novas necessidades. O exemplo da
vez ser com a classe NoticiaPrincipal:
Exemplo 1.1.1 Teste de Herana com a Classe NoticiaPrincipal:
<?php
# noticia_heranca.php
include_once('noticia.class.php');
class NoticiaPrincipal extends Noticia
{
public $imagem;
function setImagem($valor)
{
$this->imagem = $valor;
}
function exibeNoticia()
{
echo "<center>";
echo "<img src=\"". $this->imagem ."\"><p>";
echo "<b>". $this->titulo ."</b><p>";
echo $this->texto;
echo "</center><p>";
}
}
$not = new NoticiaPrincipal;
$not->titulo = 'Vestibular da Unicamp termina nesta quarta-feira';
$not->texto = 'Um dos maiores vestibulares do pas acaba nesta quarta-feira,';
$not->texto .= 'com nmero recorde de inscritos';
$not->imagem = 'img_unicamp.jpg';
$not->exibeNoticia();
?>
PHP Avanado
PHP Avanado
PHP Avanado
1.3- Encapsulamento
Este recurso possibilita ao programador restringir ou liberar o acesso s
propriedades e mtodos das classes. A utilizao deste recurso s se tornou
possvel partir do PHP 5. Aplica-se este conceito atravs dos operadores:
PHP Avanado
10
PHP Avanado
11
PHP Avanado
1.4- Interfaces
Interfaces permitem a criao de cdigo que especifica quais mtodos uma
classe deve implementar, sem ter que definir como esses mtodos sero
tratados. Interfaces so definidas utilizando a palavra-chave interface, e devem
ter definies para todos os mtodos listados na interface. Classes podem
implementar mais de uma interface se desejarem, listando cada interface
separada por um espao.
Dizer que uma classe implementa uma interface e no definir todos os
mtodos na interface resultar em um erro fatal exibindo quais mtodos no
foram implementados. Vamos criar uma interface que servir de base para as
nossas classes de notcias utilizadas at agora:
Exemplo 1.4.1 Interface iNoticia:
<?php
# noticia_interface.class.php
interface iNoticia
{
public function setTitulo($valor);
public function setTexto($valor);
public function exibeNoticia();
}
?>
12
PHP Avanado
13
PHP Avanado
14
PHP Avanado
'Vestibular da Unicamp';
'Um dos maiores vestibulares do pas chega ao fim,';
'com nmero recorde de inscritos';
'img_unicamp.jpg';
15
PHP Avanado
16
PHP Avanado
17
PHP Avanado
18
PHP Avanado
mtodos
ou
19
PHP Avanado
- Mtodos mgicos
Mtodos mgicos so mtodos com funcionalidades especficas e que
podem ser utilizados de acordo com as nossas necessidades. Continuaremos a
utilizar o nosso exemplo das classes de notcias.
20
PHP Avanado
21
PHP Avanado
22
PHP Avanado
23
PHP Avanado
24
PHP Avanado
25
PHP Avanado
Para que o objeto seja realmente clonado, necessrio utilizar a palavrachave clone. E caso o mtodo __clone() esteja definido na classe deste objeto,
ele ser executado durante esta clonagem:
Exemplo 1.8.7 Executando o mtodo mgico __clone() de Noticia:
<?php
# noticia_metodo_magico_6.php
class Noticia
{
public $titulo;
public $texto;
function exibeNoticia()
{
echo "<center>";
echo "<b>". $this->titulo ."</b><p>";
echo $this->texto;
echo "</center><p>";
}
function __clone()
{
echo "<p>Obj. com o ttulo <b>" . $this->titulo . "</b> Clonado</p>";
}
}
$not = new Noticia;
$not->titulo = "Unicamp 40 anos";
$not->texto = "No ano de 2006 a Unicamp completou 40 anos de histria!";
$not->exibeNoticia();
echo "<center><b>================================================</b></center>";
$not2 = clone $not;
$not2->titulo = "Economia debate finanas mundiais e estratgias";
$not2->texto = "Comea hoje, no auditrio do Instituto de Economia da Unicamp..";
$not2->exibeNoticia();
echo "<center><b>===============================================</b></center>";
$not->exibeNoticia();
echo "<pre>";
print_r($not);
echo "</pre><p>";
echo "<pre>";
print_r($not2);
echo "</pre><p>";
?>
26
PHP Avanado
27
PHP Avanado
__call : Esse mtodo ser chamado toda vez que for solicitada a execuo
de algum mtodo inexistente em determinada classe:
28
PHP Avanado
Captulo 2
Manipulao de
arquivos texto
Esse captulo aborda de uma maneira fcil e objetiva a manipulao de arquivos
texto atravs do PHP.
29
PHP Avanado
r : Somente leitura.
30
PHP Avanado
31
PHP Avanado
Exerccio
Reescreva o cdigo acima, seguindo os conceitos da programao orientada a
objetos. Utilize a classe arquivo, disponibilizada a seguir.
A resposta desse exerccio est na pgina 50.
32
PHP Avanado
<?php
# arquivo.class.php
class arquivo
{
# Atributos
protected $abertura;
protected $gravacao;
protected $leitura;
# Mtodos
# Abertura do arquivo, recebe como parametros o nome do arquivo
# e o tipo de abertura
function abreArq ($nome_arq, $tipo_abertura)
{
$this->abertura = fopen("$nome_arq", "$tipo_abertura");
}
# Gravao do arquivo, a funo fwrite recebe como parmetro o contedo
# e o identificador de abertura do arquivo
function gravaArq ($conteudo)
{
$this->gravacao = fwrite($this->abertura, $conteudo);
}
# Posicionamento do ponteiro numa posio especfica do arquivo
function posicionaArq ()
{
fseek($this->abertura, 0);
}
# Leitura do arquivo, a funo fread utiliza como parmetro
# o identificador de abertura do arquivo e o tamanho do arquivo
function leArq ()
{
$this->leitura = fread($this->abertura, $this->gravacao);
}
# Fechamento do arquivo, a funo fclose utiliza como parmetro
# o identificador de abertura do arquivo
function fechaArq ()
{
fclose ($this->abertura);
}
?>
33
PHP Avanado
funo fgets
L uma linha de um ponteiro de arquivo e retorna uma string. A leitura termina
quando encontra fim de linha ou fim de arquivo.
<?php
$abertura = fopen("teste.txt","r");
// Testa pelo fim de arquivo (eof)
while (!feof($abertura)) {
// fgets l uma linha de um ponteiro de arq
$buffer = fgets($abertura);
echo $buffer . "<Br>";
}
fclose($abertura);
?>
34
PHP Avanado
Captulo 3
35
PHP Avanado
36
PHP Avanado
Exerccio:
Vamos criar um feed utilizando PHP e MySQL. Inicialmente, incluiremos dados
numa tabela de notcias atravs de um formulrio. Em seguida, um programa
acessar esses dados e gerar um arquivo XML no formato RSS. Para finalizar,
outro programa vai ler o feed e exibir as notcias.
Nesse exerccio, utilizaremos os conceitos da Programao Orientada a Objetos,
vistos anteriormente.
Passo 1: Definio da tabela noticia - base de dados: capitulo3.
Utilize a ferramenta PhPMyAdmin.
Campos da tabela:
id (int, 3, chave, auto-increment)
titulo (varchar, 100)
link (varchar, 100)
descricao (text)
data_publ (date)
37
PHP Avanado
?>
38
PHP Avanado
feed.class.php :
<?php
class feed
{
public $obj_feed;
function __construct($nome_feed)
{
$this->obj_feed = simplexml_load_file($nome_feed);
}
function exibeFeed()
{
foreach ( $this->obj_feed->channel->item as $noticia )
{
echo '<br>';
echo $noticia->title . '<br>';
echo "<a href=\"$noticia->link\">$noticia->link</a>".'<br>';
echo $noticia->description . '<br>';
}
}
?>
39
PHP Avanado
<html>
<head>
<title>Formulrio</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Inserir
Notcias </strong></font></p>
<form name="form1" method="post" action="inclui_noticia.php">
<table width="50%" border="0" cellspacing="10" cellpadding="0">
<tr>
<td width="20%"><strong><font size="2" face="Verdana, Arial, Helvetica, sansserif">Ttulo:</font></strong></td>
<td width="80%"><input name="titulo" type="text" id="titulo" size="50"
maxlength="100"></td>
</tr>
<tr>
<td width="20%"><strong><font size="2" face="Verdana, Arial, Helvetica, sansserif">Link:</font></strong></td>
<td width="80%"><input name="link" type="text" id="link" size="50"
maxlength="100"></td>
</tr>
<tr>
<td width="20%"><strong><font size="2" face="Verdana, Arial, Helvetica, sansserif">Descrio:</font></strong></td>
<td width="80%"><textarea name="descricao" cols="50" rows="4"
id="descricao"></textarea></td>
</tr>
</table>
<p>
<input type="submit" name="Submit" value="Enviar">
</p>
</form>
</body>
</html>
40
PHP Avanado
# inclui_noticia.php
include_once ('classes/db.class.php');
// Recebe dados do formulrio
$titulo = $_POST["titulo"];
$link = $_POST["link"];
$descricao = $_POST["descricao"];
// obtem data de publicao
$data_publ = date("Y").'-'.date("m").'-'.date("d");
// Instancia um objeto da classe db
$inc_not = new db('localhost', 'root', 'vertrigo', 'capitulo3');
$inc_not->DBError();
$campos = "(' ', '$titulo', '$link', '$descricao', '$data_publ')";
$result = $inc_not->insert('noticia', $campos);
?>
If ($result) {
echo "Inclusao OK <br><br> <a href=\"form_noticia.html\">Voltar</a>";
}
else {
echo "Erro na Inclusao";
}
Passo 5: Script que gera o arquivo XML (Feed) a partir dos dados da
tabela noticia (gera_feed.php). Nesse script utilizaremos as classes DB
e Arquivo.
41
PHP Avanado
<?php
# gera_feed.php
function __autoload($classe)
{
include_once ("classes/$classe.class.php");
}
// Obtem data atual
$data_atual = date("Y").'-'.date("m").'-'.date("d");
// Instancia um objeto da classe db
$sel_not = new db('localhost', 'root', 'vertrigo', 'capitulo3');
$sel_not->DBError();
$condicao = "where data_publ = '$data_atual'";
$result = $sel_not->select('noticia', '*', $condicao);
// Verifica se encontrou algum registro
$row = mysql_num_rows($result);
if ($row > 0)
{
// Determina o nome do arquivo XML que ser criado
$arquivo = "feed.xml";
// Instancia um objeto da classe arquivo e abre o arquivo
$arquivo_xml = new arquivo();
$arquivo_xml->abreArq($arquivo,'w');
$conteudo
$conteudo
$conteudo
$conteudo
$conteudo
$conteudo
$conteudo
$conteudo
$conteudo
42
PHP Avanado
43
PHP Avanado
<?php
$string = file("feed.xml");
$string = implode(" ", $string);
$xml = simplexml_load_string($string);
/* Procurando pelo ttulo da primeira notcia */
$result = $xml->xpath('/rss/channel/item/title');
echo $result[0];
?>
No cdigo acima o xpath vai retornar um array para a varivel $result, contendo
todos os elementos title (ttulos) do arquivo. Ao indexarmos a varivel, estamos
escolhendo a posio do array que queremos exibir.
Obs: Tambm podemos ler o nosso arquivo RSS com um dos muitos leitores de
RSS disponveis, s cadastrar o endereo do feed desejado :
Feedreader: http://www.feedreader.com/ (Windows) Leitor de
Thunderbird: http://www.mozilla.com/thunderbird/ (Windows/Linux).
notcias
do
Sites agregadores de contedo como o Netvibes http://www.netvibes.com/ tambm disponibilizam uma interface para a incluso e leitura de feeds.
44
PHP Avanado
Captulo 4
Introduo
Em muitos casos, o cdigo de uma aplicao para a Web desorganizado,
com muitos cdigos HTML e instrues PHP escritas de qualquer jeito. Aliando o
conceito de Programao Orientada Objetos a um bom planejamento e
organizao do seu template, possvel deixar o cdigo mais enxuto e
organizado, facilitando assim a manuteno das aplicaes.
Neste captulo veremos como separar os cdigos HTML, CSS e Javascript, do
cdigo PHP da aplicao.
Ao separarmos a camada lgica (cdigo PHP), da camada de apresentao (layout
do site), possibilitamos que programador e webdesigner trabalhem de forma
independente.
45
PHP Avanado
1.1 O template
No projeto final utilizaremos um template de um site de notcias. Os scripts
referentes a esse projeto sero disponibilizados para fins de estudo. O objetivo
fornecer aos alunos um ponto de partida para que eles exercitem os conceitos
apresentados no treinamento e completem o projeto sozinhos.
Dividimos o template em 7 partes:
46
PHP Avanado
index.php : Este script organiza e instancia objetos que esto definidos nos
scritps anteriores, efetivando a apresentao da pgina principal.
47
PHP Avanado
foreach()
foreach ($array as $valor) {
comandos
}
foreach ($array as $chave => $valor) {
comandos
}
O foreach uma maneira fcil de se mover dentro de um array. O que ele faz
repetir comandos enquanto existirem elementos dentro de um array. Existem
duas sintaxes para usar o foreach, cada uma delas gerando um resultado
diferente.
<?php
$frutas = array('banana','ma','mamo','manga');
// O fluxo de execuo vai executar/repetir os comandos ligados ao
// foreach at acabarem os valores do array $frutas. A cada
// repetio o valor atual atribudo a varivel $valor
foreach($frutas as $valor) {
echo $valor; // exibida um dos valores de $frutas a cada repetio
}
// Essa sintaxe do foreach faz a mesma coisa que a sintaxe acima,
// porm ela atribui o valor da chave atual varivel $chave
// (alm do valor atual varivel $valor).
?>
array_push()
Trata array como uma pilha, e adiciona as variveis passadas como argumentos
no final de array. O comprimento de array aumenta de acordo com o nmero de
variveis adicionadas.
48
PHP Avanado
Exemplo de array_push()
<?php
$cesta = array("laranja", "morango");
array_push($cesta, "melancia", "batata");
print_r($cesta);
?>
=>
=>
=>
=>
laranja
morango
melancia
batata
49
PHP Avanado
50