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 se uintes 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 obri atoriamente citar% nas p- inas e+ternas% sua ori em 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 a re ados incorporando &ual&uer in'ormao contida neste documento devem ser re idas 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 obri atoriamente ser noti'icado /treinamentos6ccuec#unicamp#br0 de tais trabal3os com vista ao aper'eioamento e incorporao de mel3orias aos ori inais# Adicionalmente% devem ser observadas as se uintes 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 ori inal do documento 7 A locali$ao do documento ori inal deve ser citada 7 9ers.es modi'icadas no contam com o endosso dos autores ori inais 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

PHP Avanado

ndice Captulo " < Pro ramao 4rientada a 4b)etos############################################### Classes e ob)etos################################################################################### Herana ???####################################################################################### @todo construtor e destrutor################################################################ Encapsulamento#################################################################################### Cnter'aces############################################################################################### Classes abstratas################################################################################### PalavraDc3ave E'inalE############################################################################### @todos e propriedades est-ticas########################################################## @todos m- icos#################################################################################### Captulo 2 < @anipulao de ar&uivos te+to##################################################### Captulo 1 < Gimple H@I################################################################################### Captulo = < 2emplates com P44###################################################################### = > 6 A B "2 "= "6 "F 20 2B 1> =>

ltima atualizao em 18/05/2009

:iretoria de 2rans'er*ncia 2ecnol; ica < Centro de Computao < Unicamp

PHP Avanado

Captulo 1

Programao Orientada Objetos (POO) com PHP


A orientao 5 ob)etos uma maneira de pro ramar &ue modela os processos de pro ramao de uma maneira pr;+ima 5 realidade% tratando a cada componente de um pro rama 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 vanta ens na implementao deste tipo de pro ramao# A P44 tambm possibilita uma maior otimi$ao e reutili$ao do c;di o#

: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;di o 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 He an!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 ima ens nas notcias principais# Jessas subDclasses possvel rede'inir mtodos% podendo modi'ic-Dlos da 'orma &ue o pro ramador &uiser% como 'oi o caso do mtodo exibeNoticia()# Gobrescrever mtodos al o 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

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 encarre a 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

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

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 se uir aplica este conceito na classe Joticia e JoticiaPrincipal! Exemplo 1.#.' $%todo dest &to :
function __destruct() { echo Destruindo objeto...; }

"#1D Encapsulamento
Este recurso possibilita ao pro ramador restrin ir 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 pro ramas e+ternos#

:iretoria de 2rans'er*ncia 2ecnol; ica < Centro de Computao < Unicamp

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+icado es 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 se undo 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+icado es de acesso na Classe NoticiaUltimaHo a:


<?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;di o &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 a ora! 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;di o a se uir 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 conse uir 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 i uais 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 /bst ata 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;di o% 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 se uir% 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 abst ata 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 = $texto = $texto .= $imagem = 'Vestibular da Unicamp'; 'Um dos maiores vestibulares do pas chega ao fim,'; 'com nmero recorde de inscritos'; '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 2e da ca acte 3sticas 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 = $texto = $texto .= $imagem = 'Vestibular da Unicamp termina nesta quarta-feira'; 'Um dos maiores vestibulares do pas acaba nesta quarta-feira,'; 'com nmero recorde de inscritos'; '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 se uinte resultado! 4atal e o ! 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 " op iedade $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 propriedades est-ticas da classe pai 'icaria da se uinte 'orma! 5 mtodos ou

Exemplo 1.5.# " op iedade $nome_jornal sendo c2amada pela s&bclasse 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 sere+ecutado toda ve$ &ue 'or atribudo al um valor 5 al uma 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# :i amos &ue o ttulo e o te+to das nossas notcias devam se uir 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 9e i+icando a (alidando o taman2o dos campos das p op iedades $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 sere+ecutado toda ve$ &ue 'or solicitado o retorno do valor de al uma propriedade de um ob)eto# Como em __set()% este mtodo 'unciona apenas com as propriedades &ue estiverem de'inidas como protected ou private# da p op iedade $titulo com o

Exemplo 1.8.# ;eto nando o (alo 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 lon a 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 en ineL tem uma c3ance para carre ar a classe antes &ue o PHP 'al3e com erro# 4s pr;+imos dois scripts e+empli'icam este recurso!

Exemplo 1.8.' 0c ipt <&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., 0c ipt <&e &tili)a a Classe Noticia= c2amando-a at a(%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.. C ia!*o de &ma e+e >ncia pa a &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 clona em! 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

77to0t in: ! 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 al um 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 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

/be t& 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- apa ar todo o conteWdo prvio# A@ ! Xravao e Ieitura# Ge o ar&uivo )- e+istir% ir- apa ar 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#

B a(a!*o de a <&i(o: +&n!*o +A ite Essa 'uno recebe como ar umentos 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 ar umentos o identi'icador do ar&uivo /obtido no processo de abertura0 e o taman3o do ar&uivo em bTtes como se undo
:iretoria de 2rans'er*ncia 2ecnol; ica < Centro de Computao < Unicamp 10

PHP Avanado

ar umento# 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,fi esi!e($arquivo));

;eposicionando o pontei o n&m dete minado e:ist o do a <&i(o: +&n!*o +seeC Essa 'uno recebe como ar umentos 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 si ni'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 ar umento alm do pr;prio identi'icador do ar&uivo#
fc ose ($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 sc ipt:


$%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, fi esi!e($arquivo)); fc ose ($abertura); ec&o "$br/ 0onte+do do arquivo, $ eitura"; %/

Exe c3cio 8eescreva o c;di o acima% se uindo os conceitos da pro ramao orientada a ob)etos# Utili$e a classe Kar&uivoL% disponibili$ada a se uir#
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.c ass.p&p c ass 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 uti i!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 fc ose uti i!a como par9metro ' o identificador de abertura do arquivo function fec&a2rq () 1 fc ose ($t&is4/abertura); 5 ' =xibe o conte+do do arquivo, uti i!a o resu tado obtido ' pe os 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 se uir temos um e+emplo &ue utili$a essas duas 'un.es!

$%p&p $abertura = fopen("teste.txt","r"); >> ?esta pe o fim de arquivo (eof) w&i e (@feof($abertura)) 1 >> fgets A uma in&a de um ponteiro de arq $buffer = fgets($abertura); ec&o $buffer . "$Br/"; 5 fc ose($abertura); %/

:iretoria de 2rans'er*ncia 2ecnol; ica < Centro de Computao < Unicamp

1=

PHP Avanado

Captulo 1

ExtensDes do "H". pa a a manip&la!*o de 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+i e 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 ori inal H@I do PHP# Utili$a menos mem;ria &ue a :4@% porm% necessita 're&uentemente de c;di o 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 lin ua em PHP# M mais simples de se usar do &ue as e+tens.es mencionadas anteriormente# A ora vamos saber mais sobre os tipos de ar&uivos com os &uais vamos trabal3ar# O <&e % F$L H@I /eHtensible @arYup Ian ua e0 uma lin ua em de marcao &ue permite a troca de in'orma.es de 'orma estruturada atr-ves da Cnternet# M composta por ta s /assim como o H2@I0% s; &ue% en&uanto o H2@I trabal3a com ta s prD de'inidas% o H@I permite &ue o desenvolvedor crie as suas pr;prias ta s de'inindo assim a sua pr;pria lin ua em 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 pro ramas escritos em lin ua ens di'erentes# F$L +o mato ;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 nave ar pelos respectivos sites# Esses ar&uivos so escritos em H@I e tambm so con3ecidos como K'eedsL# Por meio de pro ramas 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 ta s 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 ta s &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 ta s item# Cada ta item representa uma notcia% e composta por outras ta s &ue descrevem a notcia% tais como ttulo% link e descrio# A se uir% 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[

Exe c3cio: 9amos criar um feed utili$ando PHP e @TG,I# Cnicialmente% incluiremos dados numa tabela de notcias atravs de um 'ormul-rio# Em se uida% um pro rama acessar- esses dados e erar- um ar&uivo H@I no 'ormato 8GG# Para 'inali$ar% outro pro rama vai ler o 'eed e e+ibir as notcias# Jesse e+erccio% utili$aremos os conceitos da Pro ramao 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 se uir% temos a de'inio dessas classes! db.class.p2p :
$%p&p ' db.c ass.p&p c ass db 1 pub ic $conexao; function ((construct($dominio, $usuario, $sen&a, $db) 1 $t&is4/conexao = mCsq (connect($dominio, $usuario, $sen&a); mCsq (se ect(db($db, $t&is4/conexao); 5 function DB=rror() 1 ec&o mCsq (error($t&is4/conexao); 5 function insert($tabe a, $campos) 1 $dec ar = "I*E=-? into $tabe a va ues $campos"; return mCsq (querC ($dec ar); 5 function se ect($tabe a, $campos, $condicao) 1 $dec ar = "E=;=0? $campos from $tabe a $condicao"; return mCsq (querC ($dec ar); 5 function de ete($tabe a, $condicao) 1 $dec ar = "D=;=?= from $tabe a $condicao"; return mCsq (querC ($dec ar); 5 function update($tabe a, $campos, $condicao) 1 $dec ar = "F:D2?= $tabe a E=? $campos GH=-= $condicao"; return mCsq (querC ($dec ar); 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 c ass feed 1 pub ic $obI(feed; function ((construct($nome(feed) 1 $t&is4/obI(feed = simp exm ( oad(fi e($nome(feed); 5 function exibe<eed() 1 foreac& ( $t&is4/obI(feed4/c&anne 4/item as $noticia ) 1 ec&o J$br/J; ec&o $noticia4/tit e . 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 ': 4o m&l6 io pa a a ent ada de dados J+o m7noticia.2tmlK

$&tm / $&ead/ $tit e/<ormu Lrio$>tit e/ $meta &ttp4equiv="0ontent4?Cpe" content="text>&tm ; c&arset=iso4MMNO4P"/ $>&ead/ $bodC/ $p/$font si!e="Q" face="Rerdana, 2ria , He vetica, sans4serif"/$strong/Inserir *ot.cias $>strong/$>font/$>p/ $form name="formP" met&od="post" action="inc ui(noticia.p&p"/ $tab e widt&="N#S" border="#" ce spacing="P#" ce padding="#"/ $tr/ $td widt&="Q#S"/$strong/$font si!e="Q" face="Rerdana, 2ria , He vetica, sans4 serif"/?.tu o,$>font/$>strong/$>td/ $td widt&="M#S"/$input name="titu o" tCpe="text" id="titu o" si!e="N#" max engt&="P##"/$>td/ $>tr/ $tr/ $td widt&="Q#S"/$strong/$font si!e="Q" face="Rerdana, 2ria , He vetica, sans4 serif"/;in",$>font/$>strong/$>td/ $td widt&="M#S"/$input name=" in"" tCpe="text" id=" in"" si!e="N#" max engt&="P##"/$>td/ $>tr/ $tr/ $td widt&="Q#S"/$strong/$font si!e="Q" face="Rerdana, 2ria , He vetica, sans4 serif"/Descri78o,$>font/$>strong/$>td/ $td widt&="M#S"/$textarea name="descricao" co s="N#" rows="T" id="descricao"/$>textarea/$>td/ $>tr/ $>tab e/ $p/ $input tCpe="submit" name="Eubmit" va ue="=nviar"/ $>p/ $>form/ $>bodC/ $>&tm /

:iretoria de 2rans'er*ncia 2ecnol; ica < Centro de Computao < Unicamp

=0

PHP Avanado

"asso ,: O sc ipt incl&i7noticia.p2p +a 6 a incl&s*o dos dados ecebidos pelo +o m&l6 io na tabela noticia= &tili)ando a classe GL.
$%p&p

' inc ui(noticia.p&p inc ude(once (Jc asses>db.c ass.p&pJ); >> -ecebe dados do formu Lrio $titu o = $(:UE?V"titu o"W; $ in" = $(:UE?V" in""W; $descricao = $(:UE?V"descricao"W; >> obtem data de pub ica78o $data(pub = date("X").J4J.date("m").J4J.date("d"); >> Instancia um obIeto da c asse db $inc(not = new db(J oca &ostJ, JrootJ, JvertrigoJ, Jcapitu oYJ); $inc(not4/DB=rror(); $campos = "(J J, J$titu oJ, J$ in"J, J$descricaoJ, J$data(pub J)"; $resu t = $inc(not4/insert(JnoticiaJ, $campos); If ($resu t) 1 ec&o "Inc usao UZ $br/$br/ $a &ref=K"form(noticia.&tm K"/Ro tar$>a/"; 5 e se 1 ec&o "=rro na Inc usao"; 5

%/

"asso .: 0c ipt <&e :e a o a <&i(o F$L J4eedK a pa ti dos dados da tabela noticia J:e a7+eed.p2pK. Nesse sc ipt &tili)a emos 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 ((auto oad($c asse) 1 inc ude(once ("c asses>$c asse.c ass.p&p"); 5 >> Ubtem data atua $data(atua = date("X").J4J.date("m").J4J.date("d"); >> Instancia um obIeto da c asse db $se (not = new db(J oca &ostJ, JrootJ, JvertrigoJ, Jcapitu oYJ); $se (not4/DB=rror(); $condicao = "w&ere data(pub = J$data(atua J"; $resu t = $se (not4/se ect(JnoticiaJ, J[J, $condicao); >> Rerifica se encontrou a gum registro $row = mCsq (num(rows($resu t); if ($row / #) 1 >> Determina o nome do arquivo \3; que serL criado $arquivo = "feed.xm "; >> Instancia um obIeto da c asse arquivo e abre o arquivo $arquivo(xm = new arquivo(); $arquivo(xm 4/abre2rq($arquivo,JwJ); $conteudo $conteudo $conteudo $conteudo $conteudo $conteudo $conteudo $conteudo $conteudo = "$%xm version=JP.#J encoding=JIEU4MMNO4PJ%/"; .= "$rss version=JQ.#J/"; .= J$c&anne /J; .= J$tit e/Eeu Eite$>tit e/J; .= J$ in"/&ttp,>>www.seusite.com.br$> in"/J; .= J$description/Descri78o de seu site$>description/J; .= J$ anguage/pt4br$> anguage/J; .= J$copCrig&t/0opCrig&t de seu site$>copCrig&t/J; .= J$webmaster/webmaster]seusite.com.br$>webmaster/J;

w&i e ($resu tQ = mCsq (fetc&(assoc($resu t)) 1 >> 3onta as tags referentes as noticias $conteudo .= "$item/"; $conteudo .= "$tit e/$resu tQVtitu oW$>tit e/"; $conteudo .= "$ in"/$resu tQV in"W$> in"/"; $conteudo .= "$description/$resu tQVdescricaoW$>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 \\ @ensa em ec3o ^4 ar&uivo Zb[^#Var&uivo#^Z\b[ 'oi erado com sucesso _^S ` N[

O sc ipt :e a7+eed.p2p i 6 :e a o a <&i(o H+eed.xmlI com +o mato ;00.


:iretoria de 2rans'er*ncia 2ecnol; ica < Centro de Computao < Unicamp =2

PHP Avanado

O conteEdo desse a <&i(o +ica 6 pa ecido com o cMdi:o a se:&i :


$%xm version="P.#" encoding="IEU4MMNO4P"%/ $rss version="Q.#"/ $c&anne / $tit e/Eeu Eite$>tit e/ $ 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/ $tit e/*oticia P$>tit e/ $ in"/F-; da *ot.cia P$> in"/ $description/Descri78o da *ot.cia P $>description/ $>item/ $item/ $tit e/*oticia Q$>tit e/ $ in"/ F-; da *ot.cia Q$> in"/ $description/ Descri78o da *ot.cia Q $>description/ $>item/ $item/ $tit e/*oticia n$>tit e/ $ in"/ F-; da *ot.cia n $> in"/ $description/ Descri78o da *ot.cia n $>description/ $>item/ $>c&anne / $>rss/

"asso 1 exe c3cio: C ie &m sc ipt Jexibe7noticia.p2pK pa a le o +eed c iado 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.b N+ol2aNil&st adaN ssO?1.xml O&t os ec& sos da extens*o 0impleF$L 4 GimpleH@I tambm disponibili$a outros recursos bastante Wteis% como a 'uno simplexml load strin!% 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 se uir% 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 se uida lemos essa strin com a 'uno simplexml load strin! 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 = fi e("feed.xm "); $string = imp ode(" ", $string); $xm = simp exm ( oad(string($string); >[ :rocurando pe o t.tu o da primeira not.cia [> $resu t = $xm 4/xpat&(J>rss>c&anne >item>tit eJ); ec&o $resu tV#W; %/

Jo c;di o 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 23underbird! 3ttp!\\aaa#mo$illa#com\t3underbird\ /bindoas\Iinu+0# notcias do

Gites a re adores 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

-nt od&!*o
Em muitos casos% o c;di o de uma aplicao para a beb desor ani$ado% com muitos c;di os H2@I e instru.es PHP escritas de &ual&uer )eito# Aliando o conceito de Pro ramao 4rientada 5 4b)etos a um bom plane)amento e or ani$ao do seu template% possvel dei+ar o c;di o mais en+uto e or ani$ado% 'acilitando assim a manuteno das aplica.es# Jeste captulo veremos como separar os c;di os H2@I% CGG e Qavascript% do c;di o PHP da aplicao# Ao separarmos a camada l; ica /c;di o PHP0% da camada de apresentao /laTout do site0% possibilitamos &ue pro ramador e aebdesi ner 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 ima ens# 2# $en& ! Ja coluna es&uerda encontraDseDse o menu de nave ao# 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 Ho a ! 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 or ani$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 se uir% apresentamos al umas '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

+o eac2JK 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 f uxo de execu78o vai executar>repetir os comandos igados ao >> foreac& at acabarem os va ores do arraC $frutas. 2 cada >> repeti78o o va or atua atribu.do a variLve $va or foreac&($frutas as $va or) 1 ec&o $va or; >> ^ exibida um dos va ores de $frutas a cada repeti78o 5 >> =ssa sintaxe do foreac& fa! a mesma coisa que a sintaxe acima, >> porm e a atribui o va or da c&ave atua _ variLve $c&ave >> (a m do va or atua _ variLve $va or). foreac&($frutas as $c&ave =/ $va or) 1 ec&o $c&ave . J4J . $va or; >> retorna a go como JQ 4 mam8oJ a cada repeti78o 5

%/

a aQ7p&s2JK 2rata array como uma pil3a% e adiciona as vari-veis passadas como ar umentos 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 a aQ7p&s2JK $%p&p $cesta = arraC(" aranIa", "morango"); arraC(pus&($cesta, "me ancia", "batata"); print(r($cesta); %/

Neste caso $stac" teria os seguintes elementos:


2rraC ( V#W VPW VQW VYW ) =/ aranIa =/ morango =/ me ancia =/ batata

:iretoria de 2rans'er*ncia 2ecnol; ica < Centro de Computao < Unicamp

=B

PHP Avanado

;espostas dos exe c3cios: Exe c3cio 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 >> Inc ui o script onde foi definida a c asse a ser uti i!ada inc ude(once (Jc asses>arquivo.c ass.p&pJ); ' Inicia i!a variLveis que ser8o passadas como par9metros $arquivo = "teste.txt"; $conteudo = "Isto um teste"; ' Instancia um obIeto da c asse 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 $arq4/posiciona2rq(); ' 0&ama o mtodo de $arq4/ e2rq(); eitura de arquivo eitura

' 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(); %/

Exe c3cio do cap3t&lo ' p6:. ,' Passo 6 D script e+ibeOnoticia#p3p


$%p&p ' exibe(noticia.p&p inc ude(once (Jc asses>feed.c ass.p&pJ); $noticia = new feed(Jfeed.xm J); $noticia4/=xibe<eed(); %/

:iretoria de 2rans'er*ncia 2ecnol; ica < Centro de Computao < Unicamp

>0

Você também pode gostar