Você está na página 1de 50

PHP Avanado

Licenciamento de Uso
Este documento propriedade intelectual 2006 do Centro de Computao da Unicamp e
distribudo sob os seuintes termos!
"# As apostilas publicadas pelo Centro de Computao da Unicamp podem ser reprodu$idas e
distribudas no todo ou em parte% em &ual&uer meio 'sico ou eletr(nico% desde &ue os
termos desta licena se)am obedecidos% e &ue esta licena ou re'er*ncia a ela se)a e+ibida
na reproduo#
2# ,ual&uer publicao na 'orma impressa deve obriatoriamente citar% nas p-inas e+ternas%
sua oriem e atribui.es de direito autoral /o Centro de Computao da Unicamp e seu/s0
autor/es00#
1# 2odas as tradu.es e trabal3os derivados ou areados incorporando &ual&uer in'ormao
contida neste documento devem ser reidas por estas mesmas normas de distribuio e
direitos autorais# 4u se)a% no permitido produ$ir um trabal3o derivado desta obra e
impor restri.es 5 sua distribuio# 4 Centro de Computao da Unicamp deve
obriatoriamente ser noti'icado /treinamentos6ccuec#unicamp#br0 de tais trabal3os com
vista ao aper'eioamento e incorporao de mel3orias aos oriinais#
Adicionalmente% devem ser observadas as seuintes restri.es!
7 A verso modi'icada deve ser identi'icada como tal
7 4 respons-vel pelas modi'ica.es deve ser identi'icado e as modi'ica.es datadas
7 8econ3ecimento da 'onte oriinal do documento
7 A locali$ao do documento oriinal deve ser citada
7 9ers.es modi'icadas no contam com o endosso dos autores oriinais a menos &ue
autori$ao para tal se)a 'ornecida por escrito#
A licena de uso e redistribuio deste material o'erecida sem nen3uma arantia de &ual&uer
tipo% e+pressa ou implcita% &uanto a sua ade&uao a &ual&uer 'inalidade# 4 Centro de
Computao da Unicamp no assume &ual&uer responsabilidade sobre o uso das in'orma.es
contidas neste material#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 2
PHP Avanado
ndice
Captulo " < Proramao 4rientada a 4b)etos############################################### =
Classes e ob)etos################################################################################### >
Herana ???####################################################################################### 6
@todo construtor e destrutor################################################################ A
Encapsulamento#################################################################################### B
Cnter'aces############################################################################################### "2
Classes abstratas################################################################################### "=
PalavraDc3ave E'inalE############################################################################### "6
@todos e propriedades est-ticas########################################################## "F
@todos m-icos#################################################################################### 20
Captulo 2 < @anipulao de ar&uivos te+to##################################################### 2B
Captulo 1 < Gimple H@I################################################################################### 1>
Captulo = < 2emplates com P44###################################################################### =>
ltima atualizao em 18/05/2009
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 1
PHP Avanado
Captulo 1
Programao Orientada
Programao Orientada

Objetos (POO) com PHP
Objetos (POO) com PHP
A orientao 5 ob)etos uma maneira de proramar &ue modela os
processos de proramao de uma maneira pr;+ima 5 realidade% tratando a cada
componente de um prorama como um ob)eto% com suas caractersticas e
'uncionalidades# 4 tratamento de ob)etos no PHP > 'oi totalmente reescrito%
permitindo a utili$ao de uma maior &uantidade de recursos da P44% mel3or
per'ormance e mais vantaens na implementao deste tipo de proramao#
A P44 tambm possibilita uma maior otimi$ao e reutili$ao do c;dio#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp =
PHP Avanado
1. Classes e Objetos
Classe a estrutura mais 'undamental para a criao de um ob)eto# Uma
classe nada mais do &ue um con)unto de vari-veis /propriedades ou atributos0 e
'un.es /mtodos0% &ue de'inem o estado e o comportamento do ob)eto# ,uando
criamos uma classe% temos como ob)etivo 'inal a criao de ob)etos% &ue nada
mais so do &ue representa.es dessa classe em uma vari-vel# Para declararmos
uma classe% utili$amos a palavraDc3ave class# Josso e+emplo 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();
?>
4bs! como os atributos so do tipo public% podemos atribuir valores diretamente
para eles% sem a necessidade de utili$ar os mtodos# Para manipularmos vari-veis
na classe% precisamos usar a vari-vel $this% 'un.es e o separador -># A classe
deve utili$ar a vari-vel $this para re'erenciar seus pr;prios mtodos e atributos#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp >
PHP Avanado
"#"< Herana
Herana uma 'orma de reutili$ao de c;dio em &ue novas classes so
criadas a partir de classes e+istentes% absorvendo seus atributos e
comportamentos% e complementandoDos com novas necessidades# 4 e+emplo da
ve$ ser- com a classe JoticiaPrincipal!
Exemplo 1.1.1 Teste de Hean!a com a Classe Noticia"incipal:
<?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();
?>
Como mostra o e+emplo% a classe JoticiaPrincipal 3erdou todas as
caractersticas da classe Joticia% e ainda 'oi adicionado o mtodo &ue d- suporte
5 e+ibio de imaens nas notcias principais# Jessas subDclasses possvel
rede'inir mtodos% podendo modi'ic-Dlos da 'orma &ue o proramador &uiser%
como 'oi o caso do mtodo exibeNoticia()# Gobrescrever mtodos alo
bastante comum no processo de 3erana% visto &ue os mtodos &ue 'oram criados
na classe KpaiL no precisam ser necessariamente os mesmos &ue os de'inidos
nas classes K'il3asL#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 6
PHP Avanado
"#2< @todo Construtor e :estrutor
Construtor ! M um mtodo &ue utili$a o nome reservado __construct() e &ue
no precisa ser c3amado da 'orma convencional% pois e+ecutado
automaticamente &uando instanciamos um ob)eto a partir de uma classe# Gua
utili$ao indicada para rotinas de iniciali$ao# 4 mtodo construtor se
encarrea de e+ecutar as a.es de iniciali$ao dos ob)etos% como por
e+emplo% atribuir valores a suas propriedades#
Exemplo 1.#.1 $%todo const&to na Classe Noticia:
<?php
# noticia_construct.class.php
class Noticia
{
public $titulo;
public $texto;
function __construct($valor_tit, $valor_txt)
{
$this->titulo = $valor_tit;
$this->texto = $valor_txt;
}
function exibeNoticia()
{
echo "<center>";
echo "<b>". $this->titulo ."</b><p>";
echo $this->texto;
echo "</center><p>";
}
}
$not = new Noticia('Novo curso de PHP Avanado','Abordaremos: POO, XML, etc.');
$not->exibeNoticia();
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp A
PHP Avanado
E como 'icaria a classe 'il3a JoticiaPrincipal com um mtodo construtorN
Exemplo 1.#.# $%todo const&to na s&bclasse Noticia"incipal:
<?php
# noticia_construct_heranca.php
include_once('noticia_construct.class.php');
class NoticiaPrincipal extends Noticia
{
public $imagem;
function __construct($valor_tit, $valor_txt, $valor_img)
{
parent::__construct($valor_tit, $valor_txt);
$this->imagem = $valor_img;
}
function exibeNoticia()
{
echo "<center>";
echo "<u><img src=\"". $this->imagem ."\"></u><p>";
echo "<b>". $this->titulo ."</b><p>";
echo $this->texto;
echo "</center><p>";
}
}
$titulo = 'Vestibular da Unicamp termina nesta quarta-feira';
$texto = 'Um dos maiores vestibulares do pas acaba nesta quarta-feira..';
$imagem = 'img_unicamp.jpg';
$not = new NoticiaPrincipal($titulo, $texto, $imagem);
$not->exibeNoticia();
?>
4 mtodo construtor da classe Joticia 3erdado e e+ecutado
automaticamente na subclasse JoticiaPrincipal# Porm% as caractersticas
espec'icas de JoticiaPrincipal no sero iniciali$adas pelo mtodo construtor da
classe pai# 4utro detal3e importante! caso a subclasse JoticiaPrincipal ten3a
declarado um mtodo construtor em sua estrutura% este mesmo mtodo da classe
Joticia no ser- 3erdado# Jesse caso podemos c3amar o mtodo construtor da
Classe Joticia% atravs de uma c3amada espec'ica! parent!!OOconstruct/0
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp F
PHP Avanado
:estrutor ! 4 mtodo destrutor ser- c3amado assim &ue todas as re'er*ncias a
um ob)eto em particular 'orem removidas ou &uando o ob)eto 'or e+plicitamente
destrudo# 4 mtodo OOdestruct e+ecutado toda ve$ &ue um ob)eto da classe
destrudo pelo 'im do script ou atravs da 'uno unset# Gua 'uno
basicamente $erar vari-veis% limpar dados de sess.es% 'ec3ar cone+.es com
banco de dados% etc#
Como no mtodo construtor% o mtodo destrutor possui um nome
reservado% o __destruct()# 4 e+emplo a seuir aplica este conceito na classe
Joticia e JoticiaPrincipal!
Exemplo 1.#.' $%todo dest&to:
function __destruct()
{
echo Destruindo objeto...;
}
"#1D Encapsulamento
Este recurso possibilita ao proramador restrinir ou liberar o acesso 5s
propriedades e mtodos das classes# A utili$ao deste recurso s; se tornou
possvel 5 partir do PHP ># AplicaDse este conceito atravs dos operadores!
"&blic ! ,uando de'inimos uma propriedade ou mtodo como public% estamos
di$endo &ue suas in'orma.es podem ser acessadas diretamente por &ual&uer
script% a &ual&uer momento# At este momento% todas as propriedades e
mtodos das classes &ue vimos 'oram de'inidas dessa 'orma#
"otected ! ,uando de'inimos em uma classe uma propriedade ou mtodo do
tipo protected% estamos de'inindo &ue ambos s; podero ser acessados pela
pr;pria classe ou por seus 3erdeiros% sendo impossvel reali$ar o acesso
e+terno#
"i(ate ! ,uando de'inimos propriedades e mtodos do tipo private% s; a
pr;pria classe pode reali$ar o acesso% sendo ambos invisveis para 3erdeiros ou
para classes e proramas e+ternos#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp B
PHP Avanado
A utili$ao destes modi'icadores de acesso encontraDse nos pr;+imos dois
e+emplos# 4 primeiro e+emplo rede'iniu as classes Joticia e JoticiaPrincipal!
Exemplo 1.'.1 Utili)a!*o dos modi+icadoes de acesso nas Classes
Noticia e Noticia"incipal:
<?php
# noticia_encapsula.class.php
class Noticia
{
protected $titulo;
protected $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>";
}
}
class NoticiaPrincipal extends Noticia
{
private $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>";
}
}
?>
Jo seundo e+emplo% a classe JoticiaUltimaHora criada% e 3erda as
caractersticas da classe JoticiaPrincipal#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp "0
PHP Avanado
Exemplo 1.'.# Utili)a!*o dos modi+icadoes de acesso na Classe
NoticiaUltimaHoa:
<?php
# noticia_ultimahora.php
include_once ('noticia_encapsula.class.php');
class NoticiaUltimaHora extends NoticiaPrincipal
{
function exibeNoticia()
{
echo "<center>";
echo "<b>". $this->titulo ."</b><p>";
echo $this->texto;
echo "</center><p>";
}
}
$titulo = 'Vestibular da Unicamp';
$texto = 'Um dos maiores vestibulares do pas tem nmero recorde de inscritos';
$imagem = 'img_unicamp.jpg';
$not_princ = new NoticiaPrincipal;
$not_princ->setTitulo($titulo);
$not_princ->setTexto($texto);
$not_princ->setImagem($imagem);
$not_princ->exibeNoticia();
echo "<pre>";
print_r($not_princ);
echo "</pre>";
$titulo = 'Campus recebe 500 novas rvores';
$texto = 'Plantio, realizado entre 2007 e o primeiro semestre de 2008,';
$texto .= ' integra programa ambiental que estimula a participao da comunidade';
$not_ulthora = new NoticiaUltimaHora;
$not_ulthora->setTitulo($titulo);
$not_ulthora->setTexto($texto);
$not_ulthora->exibeNoticia();
echo "<pre>";
print_r($not_ulthora);
echo "</pre>";
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp ""
PHP Avanado
"#=D Cnter'aces
Cnter'aces permitem a criao de c;dio &ue especi'ica &uais mtodos uma
classe deve implementar% sem ter &ue de'inir como esses mtodos sero
tratados# Cnter'aces so de'inidas utili$ando a palavraDc3ave interface% e devem
ter de'ini.es para todos os mtodos listados na inter'ace# Classes podem
implementar mais de uma inter'ace se dese)arem% listando cada inter'ace
separada por um espao#
:i$er &ue uma classe implementa uma inter'ace e no de'inir todos os
mtodos na inter'ace resultar- em um erro 'atal e+ibindo &uais mtodos no
'oram implementados# 9amos criar uma inter'ace &ue servir- de base para as
nossas classes de notcias utili$adas at aora!
Exemplo 1.,.1 -nte+ace iNoticia:
<?php
# noticia_interface.class.php
interface iNoticia
{
public function setTitulo($valor);
public function setTexto($valor);
public function exibeNoticia();
}
?>
A implementao desta inter'ace simples# Jo c;dio a seuir utili$amos a
nossa inter'ace iJoticia para a classe Joticia e conse&Pentemente
JoticiaPrincipal!
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp "2
PHP Avanado
Exemplo 1.,.# -nte+ace iNoticia implementada na Classe Noticia:
<?php
# noticia_interface_impl.php
include_once('noticia_interface.class.php');
class Noticia implements iNoticia
{
protected $titulo;
protected $texto;
public function setTitulo($valor)
{
$this->titulo = $valor;
}
public function setTexto($valor)
{
$this->texto = $valor;
}
public function exibeNoticia()
{
echo "<center>";
echo "<b>". $this->titulo ."</b><p>";
echo $this->texto;
echo "</center><p>";
}
}
$titulo = 'Vestibular da Unicamp';
$texto = 'Um dos maiores vestibulares do pas tem nmero recorde de inscritos';
$not = new Noticia;
$not->setTitulo($titulo);
$not->setTexto($texto);
$not->exibeNoticia();
echo "<pre>";
print_r($not);
echo "</pre>";
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp "1
PHP Avanado
"#> D Classes Abstratas
Classes abstratas so classes &ue no podem ser instanciadas diretamente%
sendo necess-ria a criao de uma subDclasse para conseuir utili$ar suas
caractersticas# Csso no &uer di$er &ue os mtodos destas classes tambm
precisem ser abstratos% isso opcional# Q- as propriedades no podem ser
de'inidas como abstratas#
A&ui vemos o conceito de polimor'ismo% ou se)a% a possibilidade de dois ou
mais ob)etos e+ecutarem a mesma ao# Um e+emplo pr-tico seria uma moto e
um carro% os dois tem a ao em comum de Rrear e AcelerarS em orientao a
ob)etos usamos classes abstratas para dar 'uncionalidades iuais a ob)etos
di'erentes#
9amos trans'ormar a classe Joticia em uma classe abstrata e depois 3erdar
suas caractersticas para a subDclasse JoticiaPrincipal# Abai+o% a se&P*ncia de
e+emplos para demonstrar este recurso!
Exemplo 1...1 Classe /bstata Noticia
<?php
# noticia_abstrata.class.php
abstract class Noticia
{
protected $titulo;
protected $texto;
public function setTitulo($valor)
{
$this->titulo = $valor;
}
abstract public function setTexto($valor);
abstract public function exibeNoticia();
}
?>
4 e+emplo acima nos mostra a utili$ao tanto de mtodos abstratos
&uanto de mtodos comuns# 4s mtodos abstratos no devem conter c;dio%
apenas de'inio# ,uando criamos um mtodo abstrato% 'a$emos com &ue ele se)a
implementado em todas as classes &ue 3erdarem dessa classe abstrata#
Jo e+emplo a seuir% os mtodos abstratos sero de'inidos na subDclasse &ue
3erdar- Joticia% ou se)a% JoticiaPrincipal!
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp "=
PHP Avanado
Exemplo 1...# 0&b-classe Noticia"incipal &tili)ando a classe abstata
Noticia:
<?php
# noticia_abstrata.php
include_once('noticia_abstrata.class.php');
class NoticiaPrincipal extends Noticia
{
private $imagem;
public function setTexto($valor)
{
$this->texto = $valor;
}
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>";
}
}
$titulo = 'Vestibular da Unicamp';
$texto = 'Um dos maiores vestibulares do pas chega ao fim,';
$texto .= 'com nmero recorde de inscritos';
$imagem = 'img_unicamp.jpg';
$not = new NoticiaPrincipal;
$not->setTitulo($titulo);
$not->setTexto($texto);
$not->setImagem($imagem);
$not->exibeNoticia();
echo "<pre>";
print_r($not);
echo "</pre>";
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp ">
PHP Avanado
"#6D A palavraDc3ave 'final'
Classes de'inidas com a palavraDc3ave final no podem ser 3erdadas por
outras classes# ,uando um mtodo de'inido dessa 'orma% as subclasses &ue o
3erdarem no podero sobrescrev*Dlos# 4s pr;+imos e+emplos mostram a
utili$ao deste recurso!
Exemplo 1.1.1 Classe Noticia de+inida com a pala(a-c2a(e final:
<?php
# noticia_final.class.php
final class Noticia
{
protected $titulo;
protected $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>";
}
}
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp "6
PHP Avanado
Exemplo 1.1.# Classe Noticia"incipal 2eda caacte3sticas da classe
Noticia:
<?php
# noticia_final.php
include_once('noticia_final.class.php');
class NoticiaPrincipal extends Noticia
{
private $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>";
}
}
$titulo = 'Vestibular da Unicamp termina nesta quarta-feira';
$texto = 'Um dos maiores vestibulares do pas acaba nesta quarta-feira,';
$texto .= 'com nmero recorde de inscritos';
$imagem = 'img_unicamp.jpg';
$not = new NoticiaPrincipal;
$not->setTitulo($titulo);
$not->setTexto($texto);
$not->setImagem($imagem);
$not->exibeNoticia();
echo "<pre>";
print_r($not);
echo "</pre>";
?>
4 teste reali$ado com essas classes mostra o seuinte resultado!
4atal eo! Class JoticiaPrincipal maT not in3erit 'rom 'inal class /Joticia0
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp "A
PHP Avanado
"#AD @todos e propriedades est-ticas
,uando de'inimos mtodos ou propriedades como est-ticos /utili$ando a
palavraDc3ave static)% estamos permitindo &ue estes possam ser c3amados
e+ternamente sem 3aver a necessidade de estarem no conte+to de um ob)eto%
isto % no necess-rio instanciar um ob)eto para poder acess-Dlos# Para ter
acesso a uma propriedade est-tica dentro do corpo da classe temos &ue usar a
palavra self acompan3ada de ::#
Exemplo 1.5.1 "opiedade $nome_jornal de+inida como est6tica na
Classe Noticia:
<?php
# noticia_estatica.class.php
class Noticia
{
public static $nome_jornal = 'The Unicamp Post';
protected $titulo;
protected $texto;
function setTitulo($valor)
{
$this->titulo = $valor;
}
function setTexto($valor)
{
$this->texto = $valor;
}
function exibeNoticia()
{
echo "<center>";
echo "Nome do Jornal: <b>" . self::$nome_jornal . "</b><p>";
echo "<b>". $this->titulo ."</b><p>";
echo $this->texto;
echo "</center><p>";
}
}
$titulo = 'Vestibular da Unicamp';
$texto = 'Um dos maiores vestibulares do pas tem nmero recorde de inscritos';
$not = new Noticia;
$not->setTitulo($titulo);
$not->setTexto($texto);
$not->exibeNoticia();
echo "<p>" . Noticia::$nome_jornal;
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp "F
PHP Avanado
,uando utili$amos o modi'icador static em atributos% ao invs de serem
alocados n atributos para n ob)etos% alocado apenas " atributo para n ob)etos%
onde todos os ob)etos t*m acesso ao mesmo atributo#
:entro da classe 'il3a JoticiaPrincipal% a c3amada 5 mtodos ou
propriedades est-ticas da classe pai 'icaria da seuinte 'orma!
Exemplo 1.5.# "opiedade $nome_jornal sendo c2amada pela s&b-
classe Noticia"incipal:
<?php
# noticia_estatica.php
include_once('noticia_estatica.class.php');
class NoticiaPrincipal extends Noticia
{
private $imagem;
function setImagem($valor)
{
$this->imagem = $valor;
}
function exibeNoticia()
{
echo "<center>";
echo "Nome do Jornal: <b>" . parent::$nome_jornal . "</b><p>";
echo "<img src=\"". $this->imagem ."\"><p>";
echo "<b>". $this->titulo ."</b><p>";
echo $this->texto;
echo "</center><p>";
}
}
$titulo = 'Vestibular da Unicamp';
$texto = 'Um dos maiores vestibulares do pas tem nmero recorde de inscritos';
$imagem = 'img_unicamp.jpg';
$not = new NoticiaPrincipal;
$not->setTitulo($titulo);
$not->setTexto($texto);
$not->setImagem($imagem);
$not->exibeNoticia();
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp "B
PHP Avanado
D @todos m-icos
@todos m-icos so mtodos com 'uncionalidades espec'icas e &ue
podem ser utili$ados de acordo com as nossas necessidades# Continuaremos a
utili$ar o nosso e+emplo das classes de notcias#
77set ! Este mtodo pode ser declarado em &ual&uer classe e ser-
e+ecutado toda ve$ &ue 'or atribudo alum valor 5 aluma propriedade do
ob)eto# 4u se)a% ele intercepta a atribuio de valores 5 propriedades de um
ob)eto# Porm% para &ue este mtodo 'uncione% estas propriedades devem
estar de'inidas como protected ou private# :iamos &ue o ttulo e o te+to
das nossas notcias devam seuir um taman3o prDde'inido# Como 'a$er
esta veri'icao e atribuir o valor correto nas propriedades
automaticamenteN
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 20
PHP Avanado
Exemplo 1.8.1 9ei+icando a (alidando o taman2o dos campos das
popiedades $titulo e $texto da classe Noticia:
<?php
# noticia_metodo_magico_1.php
class Noticia
{
protected $titulo;
public $texto;
function __set($propriedade, $valor)
{
if ( ($propriedade == 'titulo') && (strlen($valor) > 40) )
{
echo "A propriedade <b>$propriedade</b> deve conter
no mximo 40 caracteres<p>";
}
if ( ($propriedade == 'texto' && strlen($valor) > 100) )
{
echo "A propriedade <b>$propriedade</b> deve conter
no mximo 100 caracteres<p>";
}
}
function exibeNoticia()
{
echo "<center>";
echo "<b>". $this->titulo ."</b><p>";
echo $this->texto;
echo "</center><p>";
}
}
$titulo = 'Vestibular da Unicamp termina nesta quarta-feira';
$texto = 'Um dos maiores vestibulares do pas acaba nesta quarta-feira...';
$c_tit = strlen($titulo);
echo "Titulo: ".$c_tit."<p>";
$c_txt = strlen($texto);
echo "Texto: ".$c_txt."<p>";
$not = new Noticia;
$not->titulo = $titulo;
$not->texto = $texto;
$not->exibeNoticia();
echo "<pre>";
print_r($not);
echo "</pre>";
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 2"
PHP Avanado
77:et ! Este mtodo pode ser declarado em &ual&uer classe e ser-
e+ecutado toda ve$ &ue 'or solicitado o retorno do valor de aluma
propriedade de um ob)eto# Como em __set()% este mtodo 'unciona apenas
com as propriedades &ue estiverem de'inidas como protected ou private#
Exemplo 1.8.# ;etonando o (alo da popiedade $titulo com o
m%todo __get():
<?php
# noticia_metodo_magico_2.php
class Noticia
{
protected $titulo;
function __get($propriedade)
{
if ( ($propriedade == 'titulo') )
{
echo "Retornando o valor da propriedade <b>$propriedade</b>!";
return $this->titulo;
}
}
function setTitulo($valor)
{
$this->titulo = $valor;
}
}
$titulo = 'Vestibular da Unicamp termina nesta quarta-feira';
$not = new Noticia;
$not->setTitulo($titulo);
echo "<p>Ttulo: " . $not->titulo . "</p>";
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 22
PHP Avanado
77a&toload ! Ao criarem aplica.es orientadas 5 ob)eto% os
desenvolvedores colocam a de'inio de cada classe em um ar&uivo PHP#
Um dos maiores contratempos ter de escrever uma lona lista de
includes no incio de cada script /uma c3amada para cada classe
necess-ria0# Jo PHP> possvel de'inir uma 'uno __autoload(), &ue
automaticamente c3amada &uando se tenta usar uma classe &ue ainda no
'oi de'inida# Ao c3amar essa 'uno o Kscriptin enineL tem uma c3ance
para carrear a classe antes &ue o PHP 'al3e com erro# 4s pr;+imos dois
scripts e+empli'icam este recurso!
Exemplo 1.8.' 0cipt <&e cont%m a de+ini!*o da Classe Noticia :
<?php
# noticia_metodo_magico_3.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>";
}
}
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 21
PHP Avanado
Exemplo 1.8., 0cipt <&e &tili)a a Classe Noticia= c2amando-a ata(%s
de __autoload():
<?php
# noticia_metodo_magico_4.php
function __autoload($classe)
{
if ($classe == 'Noticia')
{
echo "Chamado a Classe <b>$classe</b>";
include_once('noticia_metodo_magico_3.php');
}
}
class NoticiaPrincipal extends Noticia
{
public $imagem;
function setImagem($valor)
{
$this->imagem = $valor;
}
function exibeNoticia()
{
echo "<center>";
echo "<u><img src=\"". $this->imagem ."\"></u><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();
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 2=
PHP Avanado
77clone ! Criar uma c;pia de um ob)eto com propriedades totalmente
replicadas nem sempre o comportamento dese)ado# Caso a instUncia de
um ob)eto se)a apenas atribuda 5 uma vari-vel /E+emplo "#F#>0% o ob)eto
no ser- clonado% ser- apenas criada uma nova re'er*ncia a esse ob)eto
/E+emplo "#F#60!
Exemplo 1.8.. Cia!*o de &ma e+e>ncia paa &m objeto:
$not = new Noticia;
$not_2 = $not;
Exemplo 1.8.1 Exemplo com a Classe Noticia:
<?php
# noticia_metodo_magico_5.php
class Noticia
{
public $titulo;
public $texto;
function exibeNoticia()
{
echo "<center>";
echo "<b>". $this->titulo ."</b><p>";
echo $this->texto;
echo "</center><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 = $not; // Criada a referncia para o objeto contido em $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>";
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 2>
PHP Avanado
Para &ue o ob)eto se)a realmente clonado% necess-rio utili$ar a palavraD
c3ave clone# E caso o mtodo __clone() este)a de'inido na classe deste ob)eto%
ele ser- e+ecutado durante esta clonaem!
Exemplo 1.8.5 Exec&tando o m%todo m6:ico __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>";
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 26
PHP Avanado
77to0tin: ! 4 mtodo __toString() c3amado toda ve$ &ue se invoca a
'uno print ou echo para um ob)eto# Jesses casos o p3p retornar- um erro#
M a &ue entra o mtodo OOtoGtrin% &ue pode imprimir in'orma.es
relevantes ao ob)eto# 4 printOr/Vob)eto0 tambm pode ser utili$ado#
Esse mtodo permite &ue uma classe decida como se comportar &uando
convertida para uma strin!
Exemplo 1.8.8 Utili)ando o m%todo __toString():
<?php
# noticia_metodo_magico_7.php
class Noticia
{
public $titulo;
public $texto;
function exibeNoticia()
{
echo "<center>";
echo "<b>". $this->titulo ."</b><p>";
echo $this->texto;
echo "</center><p>";
}
function __toString()
{
return "<p>Classe <b>Noticia</b></p>";
}
}
$not = new Noticia;
echo $not;
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 2A
PHP Avanado
77call ! Esse mtodo ser- c3amado toda ve$ &ue 'or solicitada a e+ecuo
de alum mtodo ine+istente em determinada classe!
Exemplo 1.8.? Utili)ando o m%todo __call():
<?php
# noticia_metodo_magico_8.php
class Noticia
{
public $titulo;
function exibeNoticia()
{
echo "<center>";
echo "<b>". $this->titulo ."</b><p>";
echo $this->texto;
echo "</center><p>";
}
function __call($metodo, $arg)
{
$this->titulo = $arg[0];
$this->texto = $arg[1];
echo "Mtodo Chamado: <b>$metodo</b><br>";
echo "Adicionado a <b>Titulo</b>, o valor " . $arg[0] . "<br>";
echo "Adicionado a <b>Texto</b>, o valor " . $arg[1];
}
}
$not = new Noticia;
$not->setTituloTexto('Titulo Adicionado','Texto Adicionado');
echo "<pre>";
print_r($not);
echo "</pre><p>";
?>
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 2F
PHP Avanado
Captulo 2
$anip&la!*o de
$anip&la!*o de

a<&i(os texto
a<&i(os texto
Esse captulo aborda de uma maneira '-cil e ob)etiva a manipulao de ar&uivos
te+to atravs do PHP#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 2B
PHP Avanado
/bet&a de a<&i(o: +&n!*o +open
Essa 'uno retorna um identi'icador do ar&uivo# Esse identi'icador deve ser
arma$enado em uma vari-vel% pois ser- utili$ado posteriormente nas 'un.es de
leitura% ravao e 'ec3amento do ar&uivo#
$arquivo = "teste.txt";
$abertura = fopen($arquivo, "w");
4s modos de abertura so!
! Gomente leitura#
@ ! Ieitura e ravao# Ge o ar&uivo )- e+istir% ir- ravar no incio do
ar&uivo#
A ! Gomente ravao# Ge o ar&uivo )- e+istir% ir- apaar todo o conteWdo
prvio#
A@ ! Xravao e Ieitura# Ge o ar&uivo )- e+istir% ir- apaar todo o conteWdo
prvio# Caso o ar&uivo no e+ista% ele ser- criado#
a ! Gomente ravao# Caso o ar&uivo e+ista ir- ravar no 'inal do ar&uivo#
Caso o ar&uivo no e+ista% ele ser- criado#
a@ ! Xravao e leitura# Caso o ar&uivo e+ista ir- ravar no 'inal do ar&uivo#
Caso o ar&uivo no e+ista% ele ser- criado#
Ba(a!*o de a<&i(o: +&n!*o +Aite
Essa 'uno recebe como arumentos o identi'icador de ar&uivo /obtido no
processo de abertura0 e uma strin /conteWdo do ar&uivo0# 8etorna o nWmero de
caracteres ravados#
$conteudo = "Isto um teste";
$gravacao = fwrite($abertura, $conteudo);
Leit&a de a<&i(o: +&n!*o +ead
Essa 'uno recebe como arumentos o identi'icador do ar&uivo /obtido no
processo de abertura0 e o taman3o do ar&uivo em bTtes como seundo
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 10
PHP Avanado
arumento# 8etorna o conteWdo do ar&uivo% &ue deve ser arma$enado em uma
vari-vel#
Para obter o taman3o do ar&uivo% podeDse utili$ar a 'uno filesize() ou ento o
resultado &ue retornou da 'uno de ravao% uma ve$ &ue a 'uno fwrite()%
como )- vimos% retorna o nWmero de caracteres ravados#
$abertura = fopen($arquivo, "r");
$eitura = fread($abertura,fiesi!e($arquivo));
;eposicionando o ponteio n&m deteminado e:isto do a<&i(o: +&n!*o
+seeC
Essa 'uno recebe como arumentos o identi'icador de ar&uivo /obtido no
processo de abertura0 e a posio do ar&uivo em &ue deve comear a 'a$er a
leitura /no e+emplo abai+o% a posio 0 sini'ica reposicionar o ponteiro no incio
do ar&uivo0#
fsee"($abertura, #);
4ec2amento de a<&i(o: +&n!*o +close
Para 'inali$ar o uso de um ar&uivo% deveDse 'ec3-Dlo% assim todas as altera.es
sero salvas# Jo necess-rio utili$ar nen3um arumento alm do pr;prio
identi'icador do ar&uivo#
fcose ($abertura);
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 1"
PHP Avanado
No exemplo a se:&i= e&nimos essas cinco +&n!Des n&m Enico scipt:
$%p&p
' teste(arquivo.p&p
$arquivo = "teste.txt";
$conteudo="Isto um teste";
$abertura=fopen("$arquivo","w)");
$gravacao = fwrite($abertura, $conteudo);
ec&o "*+mero de caracteres gravados, $gravacao";
' -eposiciona o ponteiro no in.cio do arquivo
fsee"($abertura, #);
$eitura = fread($abertura, fiesi!e($arquivo));
fcose ($abertura);
ec&o "$br/ 0onte+do do arquivo, $eitura";
%/
Exec3cio
8eescreva o c;dio acima% seuindo os conceitos da proramao orientada a
ob)etos# Utili$e a classe Kar&uivoL% disponibili$ada a seuir#
A resposta desse e+erccio est- na p-ina >0#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 12
PHP Avanado
$%p&p
' arquivo.cass.p&p
cass arquivo
1
' 2tributos
protected $abertura;
protected $gravacao;
protected $eitura;
' 3todos
' 2bertura do arquivo, recebe como parametros o nome do arquivo
' e o tipo de abertura
function abre2rq ($nome(arq, $tipo(abertura)
1
$t&is4/abertura = fopen("$nome(arq", "$tipo(abertura");
5
' 6rava78o do arquivo, a fun78o fwrite recebe como par9metro o conte+do
' e o identificador de abertura do arquivo
function grava2rq ($conteudo)
1
$t&is4/gravacao = fwrite($t&is4/abertura, $conteudo);
5
' :osicionamento do ponteiro numa posi78o espec.fica do arquivo
function posiciona2rq ()
1
fsee"($t&is4/abertura, #);
5
' ;eitura do arquivo, a fun78o fread utii!a como par9metro
' o identificador de abertura do arquivo e o taman&o do arquivo
function e2rq ()
1
$t&is4/eitura = fread($t&is4/abertura, $t&is4/gravacao);
5
' <ec&amento do arquivo, a fun78o fcose utii!a como par9metro
' o identificador de abertura do arquivo
function fec&a2rq ()
1
fcose ($t&is4/abertura);
5

' =xibe o conte+do do arquivo, utii!a o resutado obtido
' peos mtodos de grava78o e eitura
function exibe2rq ()
1
ec&o "*+mero de caracteres gravados, $t&is4/gravacao";
ec&o "$br/0onte+do do arquivo, $t&is4/eitura";
5
5
%/
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 11
PHP Avanado
4utras 'un.es Wteis para a manipulao de ar&uivos te+to!
+&n!*o +eo+
2esta pelo 'im de ar&uivo /eo'0 em um ponteiro de ar&uivo#
+&n!*o +:ets
I* uma lin3a de um ponteiro de ar&uivo e retorna uma strin# A leitura termina
&uando encontra 'im de lin3a ou 'im de ar&uivo#
A seuir temos um e+emplo &ue utili$a essas duas 'un.es!
$%p&p
$abertura = fopen("teste.txt","r");
>> ?esta peo fim de arquivo (eof)
w&ie (@feof($abertura)) 1
>> fgets A uma in&a de um ponteiro de arq
$buffer = fgets($abertura);
ec&o $buffer . "$Br/";
5
fcose($abertura);
%/
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 1=
PHP Avanado
Captulo 1
ExtensDes do "H". paa
ExtensDes do "H". paa
a manip&la!*o de
a manip&la!*o de
doc&mentos F$L
doc&mentos F$L
Ensina a manipular ar&uivos H@I utili$ando as e+tens.es do PHP#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 1>
PHP Avanado
Alm de 'un.es espec'icas para a manipulao de ar&uivos H@I% o PHP>
trabal3a com 1 e+tens.es H@I% cada &ual com suas caractersticas espec'icas!
GO$ /:ocument 4b)ect @odel0! a e+tenso com mais recursos% porm e+ie
muito trabal3o% mesmo para o H@I mais simples# Alm disso utili$a mais
mem;ria#
0/F /Gimple APC 'or H@I0! e+tenso oriinal H@I do PHP# Utili$a menos mem;ria
&ue a :4@% porm% necessita 're&uentemente de c;dio PHP comple+o#
0impleF$L! essa e+tenso )- vem 3abilitada por padro no PHP># Com ela%
trabal3aDse com documentos H@I como se 'ossem ob)etos nativos da linuaem
PHP# M mais simples de se usar do &ue as e+tens.es mencionadas anteriormente#
Aora vamos saber mais sobre os tipos de ar&uivos com os &uais vamos
trabal3ar#
O <&e % F$L
H@I /eHtensible @arYup Ianuae0 uma linuaem de marcao &ue permite a
troca de in'orma.es de 'orma estruturada atr-ves da Cnternet# M composta por
tas /assim como o H2@I0% s; &ue% en&uanto o H2@I trabal3a com tas prD
de'inidas% o H@I permite &ue o desenvolvedor crie as suas pr;prias tas de'inindo
assim a sua pr;pria linuaem de marcao# Um ar&uivo +ml nada mais do &ue
um ar&uivo te+to com marca.es% &ue permitem um maior controle sobre as
in'orma.es contidas nesse ar&uivo e &ue 'acilitam a troca de dados entre
proramas escritos em linuaens di'erentes#
F$L +omato ;00
Ainda tendo como tema um site de notcias% vamos demonstrar como criar um
ar&uivo H@I no 'ormato 8GG e como utili$ar a e+tenso GimpleH@I para ler esse
ar&uivo#
8GG um 'ormato de distribuio de in'orma.es pela Cnternet &ue permite ao
usu-rio ter acesso a notcias de v-rias 'ontes simultaneamente% sem ter &ue
navear pelos respectivos sites# Esses ar&uivos so escritos em H@I e tambm
so con3ecidos como K'eedsL#
Por meio de proramas leitores de 8GG% o usu-rio cadastra o endereo do 'eed
dese)ado e passa a receber as notcias em seu computador em tempo real% num
procedimento semel3ante ao utili$ado pelos erenciadores de eDmail#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 16
PHP Avanado
4s ar&uivos 8GG tra$em um con)unto de tas espec'icas# As principais so! rss%
channel e item #
A ta rss a ra$ do documento H@I% contendo todas as demais# :entro da ta
rss temos apenas uma ta channel# Ja ta channel temos v-rias outras tas &ue
tra$em in'orma.es sobre o documento rss! ,uem o erou% o &ue contm% data
da erao% etc# :entro da ta channel teremos tambm v-rias tas item# Cada
ta item representa uma notcia% e composta por outras tas &ue descrevem a
notcia% tais como ttulo% link e descrio#
A seuir% temos a estrutura b-sica de um ar&uivo 8GG!
Zrss[
Zc3annel[
Zitem[
Ztitle[Z\title[
ZlinY[Z\linY[
Zdescription[Z\description[
Z\item[
Zitem[
Ztitle[Z\title[
ZlinY[Z\linY[
Zdescription[Z\description[
Z\item[
Z\c3annel[
Z\rss[
Exec3cio:
9amos criar um feed utili$ando PHP e @TG,I# Cnicialmente% incluiremos dados
numa tabela de notcias atravs de um 'ormul-rio# Em seuida% um prorama
acessar- esses dados e erar- um ar&uivo H@I no 'ormato 8GG# Para 'inali$ar%
outro prorama vai ler o 'eed e e+ibir as notcias#
Jesse e+erccio% utili$aremos os conceitos da Proramao 4rientada a 4b)etos%
vistos anteriormente#
"asso 1: Ge+ini!*o da tabela HnoticiaI - base de dados: Hcapit&lo'I.
Utili$e a 'erramenta P3P@TAdmin#
Campos da tabela!
id /int% 1% c3ave% autoDincrement0
titulo /varc3ar% "000
linY /varc3ar% "000
descricao /te+t0
dataOpubl /date0
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 1A
PHP Avanado
"asso #: Ge+ini!*o das classes
Para esse e+erccio criaremos duas classes% &ue 'icaro arma$enadas na pasta
classes!
Classe db! utili$ada nos acessos ao banco de dados#
Classe 'eed! utili$ada na manipulao dos dados do ar&uivo 8GG#
A seuir% temos a de'inio dessas classes!
db.class.p2p :
$%p&p
' db.cass.p&p
cass db
1
pubic $conexao;

function ((construct($dominio, $usuario, $sen&a, $db)
1
$t&is4/conexao = mCsq(connect($dominio, $usuario, $sen&a);
mCsq(seect(db($db, $t&is4/conexao);
5
function DB=rror()
1
ec&o mCsq(error($t&is4/conexao);
5
function insert($tabea, $campos)
1
$decar = "I*E=-? into $tabea vaues $campos";
return mCsq(querC ($decar);
5
function seect($tabea, $campos, $condicao)
1
$decar = "E=;=0? $campos from $tabea $condicao";
return mCsq(querC ($decar);
5
function deete($tabea, $condicao)
1
$decar = "D=;=?= from $tabea $condicao";
return mCsq(querC ($decar);
5
function update($tabea, $campos, $condicao)
1
$decar = "F:D2?= $tabea E=? $campos GH=-= $condicao";
return mCsq(querC ($decar);
5
5
%/
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 1F
PHP Avanado
A classe db possui um mtodo construtor &ue 'ar- a cone+o com o banco de
dados assim &ue essa classe 'or instanciada# 2ambm disponibili$a mtodos &ue
'a$em a incluso% seleo% e+cluso e alterao em tabelas#
+eed.class.p2p :
$%p&p
cass feed
1
pubic $obI(feed;
function ((construct($nome(feed)
1
$t&is4/obI(feed = simpexm(oad(fie($nome(feed);
5
function exibe<eed()
1
foreac& ( $t&is4/obI(feed4/c&anne4/item as $noticia )
1
ec&o J$br/J;
ec&o $noticia4/tite . J$br/J;
ec&o "$a &ref=K"$noticia4/in"K"/$noticia4/in"$>a/".J$br/J;
ec&o $noticia4/description . J$br/J;
5
5
5
%/
Jo mtodo construtor da classe 'eed utili$amos a 'uno simplexml_load_file% &ue l*
o conteWdo de um ar&uivo H@I e retorna um ob)eto#
Jo mtodo e+ibeReed utili$amos o comando foreach% &ue o'erece uma maneira
'-cil de trabal3ar com matri$es e 'unciona somente com arraTs# 4 foreach varre
uma dada matri$ e em cada EloopE% o valor do elemento corrente atribudo a uma
vari-vel /$noticia0 e o ponteiro interno da matri$ avanado em uma posio#
@ais in'orma.es sobre essa 'uno na p-ina =F#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp 1B
PHP Avanado
"asso ': 4om&l6io paa a entada de dados J+om7noticia.2tmlK
$&tm/
$&ead/
$tite/<ormuLrio$>tite/
$meta &ttp4equiv="0ontent4?Cpe" content="text>&tm; c&arset=iso4MMNO4P"/
$>&ead/
$bodC/
$p/$font si!e="Q" face="Rerdana, 2ria, Hevetica, sans4serif"/$strong/Inserir
*ot.cias $>strong/$>font/$>p/
$form name="formP" met&od="post" action="incui(noticia.p&p"/
$tabe widt&="N#S" border="#" cespacing="P#" cepadding="#"/
$tr/
$td widt&="Q#S"/$strong/$font si!e="Q" face="Rerdana, 2ria, Hevetica, sans4
serif"/?.tuo,$>font/$>strong/$>td/
$td widt&="M#S"/$input name="tituo" tCpe="text" id="tituo" si!e="N#"
maxengt&="P##"/$>td/
$>tr/
$tr/
$td widt&="Q#S"/$strong/$font si!e="Q" face="Rerdana, 2ria, Hevetica, sans4
serif"/;in",$>font/$>strong/$>td/
$td widt&="M#S"/$input name="in"" tCpe="text" id="in"" si!e="N#"
maxengt&="P##"/$>td/
$>tr/
$tr/
$td widt&="Q#S"/$strong/$font si!e="Q" face="Rerdana, 2ria, Hevetica, sans4
serif"/Descri78o,$>font/$>strong/$>td/
$td widt&="M#S"/$textarea name="descricao" cos="N#" rows="T"
id="descricao"/$>textarea/$>td/
$>tr/
$>tabe/
$p/
$input tCpe="submit" name="Eubmit" vaue="=nviar"/
$>p/
$>form/
$>bodC/
$>&tm/
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp =0
PHP Avanado
"asso ,: O scipt incl&i7noticia.p2p +a6 a incl&s*o dos dados ecebidos
pelo +om&l6io na tabela noticia= &tili)ando a classe GL.
$%p&p
' incui(noticia.p&p
incude(once (Jcasses>db.cass.p&pJ);
>> -ecebe dados do formuLrio
$tituo = $(:UE?V"tituo"W;
$in" = $(:UE?V"in""W;
$descricao = $(:UE?V"descricao"W;
>> obtem data de pubica78o
$data(pub = date("X").J4J.date("m").J4J.date("d");
>> Instancia um obIeto da casse db
$inc(not = new db(Joca&ostJ, JrootJ, JvertrigoJ, JcapituoYJ);
$inc(not4/DB=rror();
$campos = "(J J, J$tituoJ, J$in"J, J$descricaoJ, J$data(pubJ)";
$resut = $inc(not4/insert(JnoticiaJ, $campos);
If ($resut) 1
ec&o "Incusao UZ $br/$br/ $a &ref=K"form(noticia.&tmK"/Rotar$>a/";
5
ese 1
ec&o "=rro na Incusao";
5
%/
"asso .: 0cipt <&e :ea o a<&i(o F$L J4eedK a pati dos dados da
tabela noticia J:ea7+eed.p2pK. Nesse scipt &tili)aemos as classes HGLI
e H/<&i(oI.
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp ="
PHP Avanado
$%p&p
' gera(feed.p&p
function ((autooad($casse)
1
incude(once ("casses>$casse.cass.p&p");
5
>> Ubtem data atua
$data(atua = date("X").J4J.date("m").J4J.date("d");
>> Instancia um obIeto da casse db
$se(not = new db(Joca&ostJ, JrootJ, JvertrigoJ, JcapituoYJ);
$se(not4/DB=rror();
$condicao = "w&ere data(pub = J$data(atuaJ";
$resut = $se(not4/seect(JnoticiaJ, J[J, $condicao);
>> Rerifica se encontrou agum registro
$row = mCsq(num(rows($resut);
if ($row / #)
1
>> Determina o nome do arquivo \3; que serL criado
$arquivo = "feed.xm";
>> Instancia um obIeto da casse arquivo e abre o arquivo
$arquivo(xm = new arquivo();
$arquivo(xm4/abre2rq($arquivo,JwJ);

$conteudo = "$%xm version=JP.#J encoding=JIEU4MMNO4PJ%/";
$conteudo .= "$rss version=JQ.#J/";
$conteudo .= J$c&anne/J;
$conteudo .= J$tite/Eeu Eite$>tite/J;
$conteudo .= J$in"/&ttp,>>www.seusite.com.br$>in"/J;
$conteudo .= J$description/Descri78o de seu site$>description/J;
$conteudo .= J$anguage/pt4br$>anguage/J;
$conteudo .= J$copCrig&t/0opCrig&t de seu site$>copCrig&t/J;
$conteudo .= J$webmaster/webmaster]seusite.com.br$>webmaster/J;
w&ie ($resutQ = mCsq(fetc&(assoc($resut)) 1
>> 3onta as tags referentes as noticias
$conteudo .= "$item/";
$conteudo .= "$tite/$resutQVtituoW$>tite/";
$conteudo .= "$in"/$resutQVin"W$>in"/";
$conteudo .= "$description/$resutQVdescricaoW$>description/";
$conteudo .= "$>item/";
5
>><ec&a as tags c&anne e rss
$conteudo .= J$>c&anne/J;
Vconteudo #] EZ\rss[ES
Var&uivoO+mlD[ravaAr&/Vconteudo0S
Var&uivoO+mlD['ec3aAr&/0S
\\ @ensaem
ec3o ^4 ar&uivo Zb[^#Var&uivo#^Z\b[ 'oi erado com sucesso _^S
`
N[
O scipt :ea7+eed.p2p i6 :ea o a<&i(o H+eed.xmlI com +omato ;00.
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp =2
PHP Avanado
O conteEdo desse a<&i(o +ica6 paecido com o cMdi:o a se:&i:
$%xm version="P.#" encoding="IEU4MMNO4P"%/
$rss version="Q.#"/
$c&anne/
$tite/Eeu Eite$>tite/
$in"/&ttp,>>www.seusite.com.br$>in"/
$description/Descri78o de seu site$>description/
$anguage/pt4br$>anguage/
$copCrig&t/0opCrig&t de seu site$>copCrig&t/
$webmaster/webmaster]seusite.com.br$>webmaster/
$item/
$tite/*oticia P$>tite/
$in"/F-; da *ot.cia P$>in"/
$description/Descri78o da *ot.cia P $>description/
$>item/
$item/
$tite/*oticia Q$>tite/
$in"/ F-; da *ot.cia Q$>in"/
$description/ Descri78o da *ot.cia Q $>description/
$>item/
$item/
$tite/*oticia n$>tite/
$in"/ F-; da *ot.cia n $>in"/
$description/ Descri78o da *ot.cia n $>description/
$>item/
$>c&anne/
$>rss/
"asso 1 exec3cio: Cie &m scipt Jexibe7noticia.p2pK paa le o +eed
ciado e exibi o se& conteEdo. Utili)e a classe +eed.
A resposta desse e+erccio est- na p-ina >0#
Obs! Ap;s testar com sucesso o script exibe7noticia.p2p% passando como
parUmetro o ar&uivo feed.xml, 'aa um novo teste% dessa ve$ passando como
parUmetro o 'eed da Rol3a 4nline Clustrada#
Url do 'eed! 2ttp:NN+eeds.+ol2a.&ol.com.bN+ol2aNil&stadaNssO?1.xml
O&tos ec&sos da extens*o 0impleF$L
4 GimpleH@I tambm disponibili$a outros recursos bastante Wteis% como a 'uno
simplexmlloadstrin!% utili$ada para ler uma strin H@I% e a 'uno xpath% &ue
permite acessar uma in'ormao espec'ica dentro de um ob)eto#
A seuir% um e+emplo &ue utili$a essas duas 'un.es# Primeiramente%
trans'ormamos o conteWdo do nosso ar&uivo feed.xml em uma strin% com o
au+lio da 'uno implode# Em seuida lemos essa strin com a 'uno
simplexmlloadstrin! e obtemos o ttulo da primeira notcia usando xpath!
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp =1
PHP Avanado
$%p&p
$string = fie("feed.xm");
$string = impode(" ", $string);
$xm = simpexm(oad(string($string);
>[ :rocurando peo t.tuo da primeira not.cia [>
$resut = $xm4/xpat&(J>rss>c&anne>item>titeJ);
ec&o $resutV#W;
%/
Jo c;dio acima o xpath vai retornar um arraT para a vari-vel Vresult% contendo
todos os elementos title /ttulos0 do ar&uivo# Ao inde+armos a vari-vel% estamos
escol3endo a posio do arraT &ue &ueremos e+ibir#
4bs! 2ambm podemos ler o nosso ar&uivo 8GG com um dos muitos leitores de
8GG disponveis% s; cadastrar o endereo do 'eed dese)ado !
Reedreader! 3ttp!\\aaa#'eedreader#com\ /bindoas0 Ieitor de notcias do
23underbird! 3ttp!\\aaa#mo$illa#com\t3underbird\ /bindoas\Iinu+0#
Gites areadores de conteWdo como o Jetvibes < 3ttp!\\aaa#netvibes#com\ D
tambm disponibili$am uma inter'ace para a incluso e leitura de 'eeds#

:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp ==
PHP Avanado
Captulo 4
Templates com "OO
Templates com "OO
-ntod&!*o
Em muitos casos% o c;dio de uma aplicao para a beb desorani$ado%
com muitos c;dios H2@I e instru.es PHP escritas de &ual&uer )eito# Aliando o
conceito de Proramao 4rientada 5 4b)etos a um bom plane)amento e
orani$ao do seu template% possvel dei+ar o c;dio mais en+uto e
orani$ado% 'acilitando assim a manuteno das aplica.es#
Jeste captulo veremos como separar os c;dios H2@I% CGG e Qavascript% do
c;dio PHP da aplicao#
Ao separarmos a camada l;ica /c;dio PHP0% da camada de apresentao /laTout
do site0% possibilitamos &ue proramador e aebdesiner trabal3em de 'orma
independente#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp =>
PHP Avanado
"#"< 4 template
Jo pro)eto 'inal utili$aremos um template de um site de notcias# 4s scripts
re'erentes a esse pro)eto sero disponibili$ados para 'ins de estudo# 4 ob)etivo
'ornecer aos alunos um ponto de partida para &ue eles e+ercitem os conceitos
apresentados no treinamento e completem o pro)eto so$in3os#
:ividimos o template em A partes!
4i:&a 1.1 Gi(is*o do template do "ojeto 4inal.
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp =6
PHP Avanado
"# Cabe!al2o! :e'ini.es da p-ina e imaens#
2# $en& ! Ja coluna es&uerda encontraDseDse o menu de naveao#
1# Not3cia de E(entos! Ja coluna direita encontramDse as notcias
re'erentes 5 eventos importantes#
=# Not3cia "incipal ! Jesta seo encontraDse a notcia principal% a
manc3ete do site#
># Not3cia do Gia ! Jesta seo encontramDse as notcias do dia &ue
no so manc3etes#
6# Not3cia de Pltima Hoa ! Jesta seo encontramDse as notcias de
Wltima 3ora#
A# ;odap%! in'orma.es sobre os respons-veis pelo site e a poltica de
privacidade da p-ina#
1.1.# Classes
Noticia.class.p2p : Este script contm a classe Joticia% utili$ada na
maioria dos scripts para manipulao das in'orma.es da p-ina principal#
template.class.p2p : Contm as classes respons-veis pela manipulao
do template da p-ina# 2udo &ue est- relacionado com a apresentao da
p-ina encontraDse neste script#
dbconnect.p2p : Contm a classe respons-vel pela manipulao das
in'orma.es arma$enadas no banco de dados @TG,I# ,ual&uer operao
com o banco de dados passa por ob)etos instanciados desta classe#
index.p2p : Este script orani$a e instancia ob)etos &ue esto de'inidos nos
scritps anteriores% e'etivando a apresentao da p-ina principal#
4bs! 4s scripts do pro)eto sero disponibili$ados como material complementar#
1.1.' 4&n!Des
A seuir% apresentamos alumas 'un.es do PHP &ue sero utili$adas no pro)eto!
-ncl&de7onceJK
Cnclui um script em p3p na p-ina% apenas uma ve$% ou se)a% &uando utili$amos
v-rias ve$es um mesmo script na p-ina e se por acaso dentro deste script eu
'a$er o uso de outro &ue )- 'oi usado na 3ierar&uia% o include once ir- import-Dlo
uma Wnica ve$# Q- &uando se utili$a o include normal% o script ser- importado para
cada c3amada#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp =A
PHP Avanado
+oeac2JK

foreach ($array as $valor) {
comandos
}
foreach ($array as $chave => $valor) {
comandos
}

4 'oreac3 uma maneira '-cil de se mover dentro de um arraT# 4 &ue ele 'a$
repetir comandos en&uanto e+istirem elementos dentro de um arraT# E+istem
duas sinta+es para usar o 'oreac3% cada uma delas erando um resultado
di'erente#
$%p&p
$frutas = arraC(JbananaJ,Jma78J,Jmam8oJ,JmangaJ);

>> U fuxo de execu78o vai executar>repetir os comandos igados ao
>> foreac& at acabarem os vaores do arraC $frutas. 2 cada
>> repeti78o o vaor atua atribu.do a variLve $vaor
foreac&($frutas as $vaor) 1
ec&o $vaor; >> ^ exibida um dos vaores de $frutas a cada repeti78o
5


>> =ssa sintaxe do foreac& fa! a mesma coisa que a sintaxe acima,
>> porm ea atribui o vaor da c&ave atua _ variLve $c&ave
>> (am do vaor atua _ variLve $vaor).
foreac&($frutas as $c&ave =/ $vaor) 1
ec&o $c&ave . J4J . $vaor;
>> retorna ago como JQ 4 mam8oJ a cada repeti78o
5
%/
aaQ7p&s2JK
2rata array como uma pil3a% e adiciona as vari-veis passadas como arumentos
no 'inal de array# 4 comprimento de array aumenta de acordo com o nWmero de
vari-veis adicionadas#
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp =F
PHP Avanado
E+emplo de aaQ7p&s2JK
$%p&p
$cesta = arraC("aranIa", "morango");
arraC(pus&($cesta, "meancia", "batata");
print(r($cesta);
%/
Neste caso $stac" teria os seguintes elementos:
2rraC
(
V#W =/ aranIa
VPW =/ morango
VQW =/ meancia
VYW =/ batata
)
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp =B
PHP Avanado
;espostas dos exec3cios:
Exec3cio do cap3t&lo # p6:. '#
Xravao e leitura de um ar&uivo te+to utili$ando a classe KAr&uivoL#
$%p&p
' teste(oo(arquivo.p&p
' obIetivo, gravar conte+do em um arquivo texto e exibir o conte+do gravado
>> Incui o script onde foi definida a casse a ser utii!ada
incude(once (Jcasses>arquivo.cass.p&pJ);
' Iniciai!a variLveis que ser8o passadas como par9metros
$arquivo = "teste.txt";
$conteudo = "Isto um teste";
' Instancia um obIeto da casse arquivo
$arq = new arquivo();
' 0&ama o mtodo de abertura de arquivo no modo escrita
$arq4/abre2rq($arquivo,Jw)J);
' 0&ama o mtodo de grava78o de arquivo
$arq4/grava2rq($conteudo);
' 0&ama o mtodo de abertura de arquivo no modo eitura
$arq4/posiciona2rq();
' 0&ama o mtodo de eitura de arquivo
$arq4/e2rq();
' 0&ama o mtodo de fec&amento de arquivo
$arq4/fec&a2rq();
' 0&ama o mtodo que exibe o conte+do do arquivo
$arq4/exibe2rq();
%/
Exec3cio do cap3t&lo ' p6:. ,'
Passo 6 D script e+ibeOnoticia#p3p
$%p&p
' exibe(noticia.p&p
incude(once (Jcasses>feed.cass.p&pJ);
$noticia = new feed(Jfeed.xmJ);
$noticia4/=xibe<eed();
%/
:iretoria de 2rans'er*ncia 2ecnol;ica < Centro de Computao < Unicamp >0

Você também pode gostar