Sie sind auf Seite 1von 55

PHP Mdulo II

Licenciamento de Uso
Este documento propriedade intelectual 2006 do Centro de Computao da Unicamp e
distriu!do so os se"uintes termos#
$% &s apostilas pulicadas pelo Centro de Computao da Unicamp podem ser reprodu'idas e
distriu!das no todo ou em parte( em )ual)uer meio *!sico ou eletr+nico( desde )ue os
termos desta licena se,am oedecidos( e )ue esta licena ou re*er-ncia a ela se,a e.iida
na reproduo%
2% /ual)uer pulicao na *orma impressa de0e ori"atoriamente citar( nas p1"inas e.ternas(
sua ori"em e atriui2es de direito autoral 3o Centro de Computao da Unicamp e seu3s4
autor3es44%
5% 6odas as tradu2es e traal7os deri0ados ou a"re"ados incorporando )ual)uer in*ormao
contida neste documento de0em ser re"idas por estas mesmas normas de distriuio e
direitos autorais% 8u se,a( no permitido produ'ir um traal7o deri0ado desta ora e
impor restri2es 9 sua distriuio% 8 Centro de Computao da Unicamp de0e
ori"atoriamente ser noti*icado 3treinamentos:ccuec%unicamp%r4 de tais traal7os com
0ista ao aper*eioamento e incorporao de mel7orias aos ori"inais%
&dicionalmente( de0em ser oser0adas as se"uintes restri2es#
; & 0erso modi*icada de0e ser identi*icada como tal
; 8 respons10el pelas modi*ica2es de0e ser identi*icado e as modi*ica2es datadas
; <econ7ecimento da *onte ori"inal do documento
; & locali'ao do documento ori"inal de0e ser citada
; =ers2es modi*icadas no contam com o endosso dos autores ori"inais a menos )ue
autori'ao para tal se,a *ornecida por escrito%
& licena de uso e redistriuio deste material o*erecida sem nen7uma "arantia de )ual)uer
tipo( e.pressa ou impl!cita( )uanto a sua ade)uao a )ual)uer *inalidade% 8 Centro de
Computao da Unicamp no assume )ual)uer responsailidade sore o uso das in*orma2es
contidas neste material%
&"-ncia para a >ormao Pro*issional da Unicamp &>PU 2
PHP Mdulo II
ndice
Cap!tulo $ Pro"ramao 8rientada a 8,etos%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?
Classes e o,etos%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @
Herana AAA%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6
Mtodo construtor e destrutor%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% B
Encapsulamento%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% C
Inter*aces%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $2
Classes astratas%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $?
Pala0raDc7a0e E*inalE%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $6
Mtodos e propriedades est1ticas%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $F
Mtodos m1"icos%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 20
Cap!tulo 2 Manipulao de ar)ui0os te.to%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2C
Cap!tulo 5 Gimple HMI%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5@
Cap!tulo ? 6emplates com P88%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?F
ltima atualizao em 04/10/2012
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp 5
PHP Mdulo II
Captulo 1
Programao Orientada
Programao Orientada

Objetos (POO) com PHP
Objetos (POO) com PHP
& orientao 9 o,etos uma maneira de pro"ramar )ue modela os
processos de pro"ramao de uma maneira pr.ima 9 realidade( tratando a cada
componente de um pro"rama como um o,eto( com suas caracter!sticas e
*uncionalidades% 8 tratamento de o,etos no PHP @ *oi totalmente reescrito(
permitindo a utili'ao de uma maior )uantidade de recursos da P88( mel7or
per*ormance e mais 0anta"ens na implementao deste tipo de pro"ramao%
& P88 tamm possiilita uma maior otimi'ao e reutili'ao do cdi"o%
&"-ncia para a >ormao Pro*issional da Unicamp &>PU ?
PHP Mdulo II
1. Classes e Objetos
Classe a estrutura mais *undamental para a criao de um o,eto% Uma
classe nada mais do )ue um con,unto de 0ari10eis 3propriedades ou atriutos4 e
*un2es 3mtodos4( )ue de*inem o estado e o comportamento do o,eto% /uando
criamos uma classe( temos como o,eti0o *inal a criao de o,etos( )ue nada
mais so do )ue representa2es dessa classe em uma 0ari10el% Para declararmos
uma classe( utili'amos a pala0raDc7a0e class% Kosso e.emplo ser1 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();
?>
8s# como os atriutos so do tipo public( podemos atriuir 0alores diretamente
para eles( sem a necessidade de utili'ar os mtodos% Para manipularmos 0ari10eis
na classe( precisamos usar a 0ari10el $this( *un2es e o separador ->% & classe
de0e utili'ar a 0ari10el $this para re*erenciar seus prprios mtodos e atriutos%
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp @
PHP Mdulo II
$%$ Herana
Herana uma *orma de reutili'ao de cdi"o em )ue no0as classes so
criadas a partir de classes e.istentes( asor0endo seus atriutos e
comportamentos( e complementandoDos com no0as necessidades% 8 e.emplo da
0e' ser1 com a classe KoticiaPrincipal#
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 KoticiaPrincipal 7erdou todas as
caracter!sticas da classe Koticia( e ainda *oi adicionado o mtodo )ue d1 suporte
9 e.iio de ima"ens nas not!cias principais% Kessas suDclasses poss!0el
rede*inir mtodos( podendo modi*ic1Dlos da *orma )ue o pro"ramador )uiser(
como *oi o caso do mtodo exibeNoticia()% Gorescre0er mtodos al"o
astante comum no processo de 7erana( 0isto )ue os mtodos )ue *oram criados
na classe LpaiM no precisam ser necessariamente os mesmos )ue os de*inidos
nas classes L*il7asM%
&"-ncia para a >ormao Pro*issional da Unicamp &>PU 6
PHP Mdulo II
$%2 Mtodo Construtor e Jestrutor
Construtor # N um mtodo )ue utili'a o nome reser0ado __construct() e )ue
no precisa ser c7amado da *orma con0encional( pois e.ecutado
automaticamente )uando instanciamos um o,eto a partir de uma classe% Gua
utili'ao indicada para rotinas de iniciali'ao% 8 mtodo construtor se
encarre"a de e.ecutar as a2es de iniciali'ao dos o,etos( como por
e.emplo( atriuir 0alores 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();
?>
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp B
PHP Mdulo II
E como *icaria a classe *il7a KoticiaPrincipal com um mtodo construtorO
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();
?>
8 mtodo construtor da classe Koticia 7erdado e e.ecutado
automaticamente na suclasse KoticiaPrincipal% Porm( as caracter!sticas
espec!*icas de KoticiaPrincipal no sero iniciali'adas pelo mtodo construtor da
classe pai% 8utro detal7e importante# caso a suclasse KoticiaPrincipal ten7a
declarado um mtodo construtor em sua estrutura( este mesmo mtodo da classe
Koticia no ser1 7erdado% Kesse caso podemos c7amar o mtodo construtor da
Classe Koticia( atra0s de uma c7amada espec!*ica# parent##PPconstruct34
&"-ncia para a >ormao Pro*issional da Unicamp &>PU F
PHP Mdulo II
Jestrutor # 8 mtodo destrutor ser1 c7amado assim )ue todas as re*er-ncias a
um o,eto em particular *orem remo0idas ou )uando o o,eto *or e.plicitamente
destru!do% 8 mtodo PPdestruct e.ecutado toda 0e' )ue um o,eto da classe
destru!do pelo *im do script ou atra0s da *uno unset% Gua *uno
asicamente 'erar 0ari10eis( limpar dados de sess2es( *ec7ar cone.2es com
anco de dados( etc%
Como no mtodo construtor( o mtodo destrutor possui um nome
reser0ado( o __destruct()% 8 e.emplo a se"uir aplica este conceito na classe
Koticia e KoticiaPrincipal#
Exemplo 1.#.' $%todo dest&to:
function __destruct()
{
echo Destruindo objeto...;
}
$%5D Encapsulamento
Este recurso possiilita ao pro"ramador restrin"ir ou lierar o acesso 9s
propriedades e mtodos das classes% & utili'ao deste recurso s se tornou
poss!0el 9 partir do PHP @% &plicaDse este conceito atra0s dos operadores#
"&blic # /uando de*inimos uma propriedade ou mtodo como public( estamos
di'endo )ue suas in*orma2es podem ser acessadas diretamente por )ual)uer
script( a )ual)uer momento% &t este momento( todas as propriedades e
mtodos das classes )ue 0imos *oram de*inidas dessa *orma%
"otected # /uando de*inimos em uma classe uma propriedade ou mtodo do
tipo protected( estamos de*inindo )ue amos s podero ser acessados pela
prpria classe ou por seus 7erdeiros( sendo imposs!0el reali'ar o acesso
e.terno%
"i(ate # /uando de*inimos propriedades e mtodos do tipo private( s a
prpria classe pode reali'ar o acesso( sendo amos in0is!0eis para 7erdeiros ou
para classes e pro"ramas e.ternos%
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp C
PHP Mdulo II
& utili'ao destes modi*icadores de acesso encontraDse nos pr.imos dois
e.emplos% 8 primeiro e.emplo rede*iniu as classes Koticia e KoticiaPrincipal#
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>";
}
}
?>
&"-ncia para a >ormao Pro*issional da Unicamp &>PU $0
PHP Mdulo II
Ko se"undo e.emplo( a classe KoticiaUltimaHora criada( e 7erda as
caracter!sticas da classe KoticiaPrincipal%
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>";
?>
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp $$
PHP Mdulo II
$%?D Inter*aces
Inter*aces permitem a criao de cdi"o )ue especi*ica )uais mtodos uma
classe de0e implementar( sem ter )ue de*inir como esses mtodos sero
tratados% Inter*aces so de*inidas utili'ando a pala0raDc7a0e interface( e de0em
ter de*ini2es 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%
Ji'er )ue uma classe implementa uma inter*ace e no de*inir todos os
mtodos na inter*ace resultar1 em um erro *atal e.iindo )uais mtodos no
*oram implementados% =amos criar uma inter*ace )ue ser0ir1 de ase para as
nossas classes de not!cias 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();
}
?>
& implementao desta inter*ace simples% Ko cdi"o a se"uir utili'amos a
nossa inter*ace iKoticia para a classe Koticia e conse)Qentemente
KoticiaPrincipal#
&"-ncia para a >ormao Pro*issional da Unicamp &>PU $2
PHP Mdulo II
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>";
?>
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp $5
PHP Mdulo II
$%@ D Classes &stratas
Classes astratas so classes )ue no podem ser instanciadas diretamente(
sendo necess1ria a criao de uma suDclasse para conse"uir utili'ar suas
caracter!sticas% Isso no )uer di'er )ue os mtodos destas classes tamm
precisem ser astratos( isso opcional% R1 as propriedades no podem ser
de*inidas como astratas%
&)ui 0emos o conceito de polimor*ismo( ou se,a( a possiilidade de dois ou
mais o,etos e.ecutarem a mesma ao% Um e.emplo pr1tico seria uma moto e
um carro( os dois tem a ao em comum de >rear e &celerarS em orientao a
o,etos usamos classes astratas para dar *uncionalidades i"uais a o,etos
di*erentes%
=amos trans*ormar a classe Koticia em uma classe astrata e depois 7erdar
suas caracter!sticas para a suDclasse KoticiaPrincipal% &ai.o( a se)Q-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();
}
?>
8 e.emplo acima nos mostra a utili'ao tanto de mtodos astratos
)uanto de mtodos comuns% 8s mtodos astratos no de0em conter cdi"o(
apenas de*inio% /uando criamos um mtodo astrato( *a'emos com )ue ele se,a
implementado em todas as classes )ue 7erdarem dessa classe astrata%
Ko e.emplo a se"uir( os mtodos astratos sero de*inidos na suDclasse )ue
&"-ncia para a >ormao Pro*issional da Unicamp &>PU $?
PHP Mdulo II
7erdar1 Koticia( ou se,a( KoticiaPrincipal#
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>";
?>
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp $@
PHP Mdulo II
$%6D & pala0raDc7a0e 'final'
Classes de*inidas com a pala0raDc7a0e final no podem ser 7erdadas por
outras classes% /uando um mtodo de*inido dessa *orma( as suclasses )ue o
7erdarem no podero sorescre0-Dlos% 8s 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>";
}
}
?>
&"-ncia para a >ormao Pro*issional da Unicamp &>PU $6
PHP Mdulo II
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>";
?>
8 teste reali'ado com essas classes mostra o se"uinte resultado#
4atal eo# Class KoticiaPrincipal maT not in7erit *rom *inal class 3Koticia4
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp $B
PHP Mdulo II
$%BD Mtodos e propriedades est1ticas
/uando de*inimos mtodos ou propriedades como est1ticos 3utili'ando a
pala0raDc7a0e static)( estamos permitindo )ue estes possam ser c7amados
e.ternamente sem 7a0er a necessidade de estarem no conte.to de um o,eto(
isto ( no necess1rio instanciar um o,eto para poder acess1Dlos% Para ter
acesso a uma propriedade est1tica dentro do corpo da classe temos )ue usar a
pala0ra self acompan7ada 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;
?>
&"-ncia para a >ormao Pro*issional da Unicamp &>PU $F
PHP Mdulo II
/uando utili'amos o modi*icador static em atriutos( ao in0s de serem
alocados n atriutos para n o,etos( alocado apenas $ atriuto para n o,etos(
onde todos os o,etos t-m acesso ao mesmo atriuto%
Jentro da classe *il7a KoticiaPrincipal( a c7amada 9 mtodos ou
propriedades est1ticas da classe pai *icaria da se"uinte *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();
?>
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp $C
PHP Mdulo II
D Mtodos m1"icos
Mtodos m1"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 not!cias%
77set # Este mtodo pode ser declarado em )ual)uer classe e ser1
e.ecutado toda 0e' )ue *or atriu!do al"um 0alor 9 al"uma propriedade do
o,eto% 8u se,a( ele intercepta a atriuio de 0alores 9 propriedades de um
o,eto% Porm( para )ue este mtodo *uncione( estas propriedades de0em
estar de*inidas como protected ou private% Ji"amos )ue o t!tulo e o te.to
das nossas not!cias de0am se"uir um taman7o prDde*inido% Como *a'er
esta 0eri*icao e atriuir o 0alor correto nas propriedades
automaticamenteO
&"-ncia para a >ormao Pro*issional da Unicamp &>PU 20
PHP Mdulo II
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>";
?>
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp 2$
PHP Mdulo II
77:et # Este mtodo pode ser declarado em )ual)uer classe e ser1
e.ecutado toda 0e' )ue *or solicitado o retorno do 0alor de al"uma
propriedade de um o,eto% Como em __set()( este mtodo *unciona apenas
com as propriedades )ue esti0erem 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>";
?>
&"-ncia para a >ormao Pro*issional da Unicamp &>PU 22
PHP Mdulo II
77a&toload # &o criarem aplica2es orientadas 9 o,eto( os
desen0ol0edores colocam a de*inio de cada classe em um ar)ui0o PHP%
Um dos maiores contratempos ter de escre0er uma lon"a lista de
includes no in!cio de cada script 3uma c7amada para cada classe
necess1ria4% Ko PHP@ poss!0el de*inir uma *uno __autoload(), )ue
automaticamente c7amada )uando se tenta usar uma classe )ue ainda no
*oi de*inida% &o c7amar essa *uno o Lscriptin" en"ineM tem uma c7ance
para carre"ar a classe antes )ue o PHP *al7e com erro% 8s 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>";
}
}
?>
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp 25
PHP Mdulo II
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();
?>
&"-ncia para a >ormao Pro*issional da Unicamp &>PU 2?
PHP Mdulo II
77clone # Criar uma cpia de um o,eto com propriedades totalmente
replicadas nem sempre o comportamento dese,ado% Caso a instUncia de
um o,eto se,a apenas atriu!da 9 uma 0ari10el 3E.emplo $%F%@4( o o,eto
no ser1 clonado( ser1 apenas criada uma no0a re*er-ncia a esse o,eto
3E.emplo $%F%64#
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>";
?>
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp 2@
PHP Mdulo II
Para )ue o o,eto se,a realmente clonado( necess1rio utili'ar a pala0raD
c7a0e clone% E caso o mtodo __clone() este,a de*inido na classe deste o,eto(
ele ser1 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>";
?>
&"-ncia para a >ormao Pro*issional da Unicamp &>PU 26
PHP Mdulo II
77to0tin: # 8 mtodo __toString() c7amado toda 0e' )ue se in0oca a
*uno print ou echo para um o,eto% Kesses casos o p7p retornar1 um erro%
N a! )ue entra o mtodo PPtoGtrin"( )ue pode imprimir in*orma2es
rele0antes ao o,eto% 8 printPr3Vo,eto4 tamm pode ser utili'ado%
Esse mtodo permite )ue uma classe decida como se comportar )uando
con0ertida 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;
?>
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp 2B
PHP Mdulo II
77call # Esse mtodo ser1 c7amado toda 0e' )ue *or solicitada a e.ecuo
de al"um mtodo ine.istente em determinada classe#
Exemplo 1.8.? Utili)ando o m%todo 77call@A:
<?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>";
?>
&"-ncia para a >ormao Pro*issional da Unicamp &>PU 2F
PHP Mdulo II
Cap!tulo 2
$anip&la!*o de
$anip&la!*o de

a<&i(os texto
a<&i(os texto
Esse cap!tulo aorda de uma maneira *1cil e o,eti0a a manipulao de ar)ui0os
te.to atra0s do PHP%
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp 2C
PHP Mdulo II
/bet&a de a<&i(o: +&n!*o +open
Essa *uno retorna um identi*icador do ar)ui0o% Esse identi*icador de0e ser
arma'enado em uma 0ari10el( pois ser1 utili'ado posteriormente nas *un2es de
leitura( "ra0ao e *ec7amento do ar)ui0o%
$arquivo = "teste.txt";
$abertura = fopen($arquivo, "w");
8s modos de aertura so#
# Gomente leitura%
B # Ieitura e "ra0ao% Ge o ar)ui0o ,1 e.istir( ir1 "ra0ar no in!cio do
ar)ui0o%
C # Gomente "ra0ao% Ge o ar)ui0o ,1 e.istir( ir1 apa"ar todo o conteWdo
pr0io%
CB # Xra0ao e Ieitura% Ge o ar)ui0o ,1 e.istir( ir1 apa"ar todo o conteWdo
pr0io% Caso o ar)ui0o no e.ista( ele ser1 criado%
a # Gomente "ra0ao% Caso o ar)ui0o e.ista ir1 "ra0ar no *inal do ar)ui0o%
Caso o ar)ui0o no e.ista( ele ser1 criado%
aB # Xra0ao e leitura% Caso o ar)ui0o e.ista ir1 "ra0ar no *inal do ar)ui0o%
Caso o ar)ui0o no e.ista( ele ser1 criado%
x # Gomente "ra0ao% Cria um no0o ar)ui0o% <etorna >&IGE e um erro se o
ar)ui0o ,1 e.istir%
xY # Xra0ao e Ieitura% Cria um no0o ar)ui0o% <etorna >&IGE e um erro se
o ar)ui0o ,1 e.istir%
Da(a!*o de a<&i(o: +&n!*o +Cite
Essa *uno recee como ar"umentos o identi*icador de ar)ui0o 3otido no
processo de aertura4 e uma strin" 3conteWdo do ar)ui0o4% <etorna o nWmero de
caracteres "ra0ados%
$conteudo = "Isto um teste";
$gravacao = fwrite($abertura, $conteudo);
&"-ncia para a >ormao Pro*issional da Unicamp &>PU 50
PHP Mdulo II
Leit&a de a<&i(o: +&n!*o +ead
Essa *uno recee como ar"umentos o identi*icador do ar)ui0o 3otido no
processo de aertura4 e o taman7o do ar)ui0o em Ttes como se"undo
ar"umento% <etorna o conteWdo do ar)ui0o( )ue de0e ser arma'enado em uma
0ari10el%
Para oter o taman7o do ar)ui0o( podeDse utili'ar a *uno filesize() ou ento o
resultado )ue retornou da *uno de "ra0ao( uma 0e' )ue a *uno fwrite()(
como ,1 0imos( retorna o nWmero de caracteres "ra0ados%
$abertura = fopen($arquivo, "r");
$eitura = fread($abertura,fiesi!e($arquivo));
;eposicionando o ponteio n&m deteminado e:isto do a<&i(o: +&n!*o
+seeE
Essa *uno recee como ar"umentos o identi*icador de ar)ui0o 3otido no
processo de aertura4 e a posio do ar)ui0o em )ue de0e comear a *a'er a
leitura 3no e.emplo aai.o( a posio 0 si"ni*ica reposicionar o ponteiro no in!cio
do ar)ui0o4%
fsee"($abertura, #);
4ec2amento de a<&i(o: +&n!*o +close
Para *inali'ar o uso de um ar)ui0o( de0eDse *ec71Dlo( assim todas as altera2es
sero sal0as% Ko necess1rio utili'ar nen7um ar"umento alm do prprio
identi*icador do ar)ui0o%
fcose ($abertura);
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp 5$
PHP Mdulo II
No exemplo a se:&i= e&nimos essas cinco +&n!Fes n&m Gnico 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
<eescre0a o cdi"o acima( se"uindo os conceitos da pro"ramao orientada a
o,etos% Utili'e a classe Lar)ui0oM( disponiili'ada a se"uir%
& resposta desse e.erc!cio est1 na p1"ina @5%
&"-ncia para a >ormao Pro*issional da Unicamp &>PU 52
PHP Mdulo II
$%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
%/
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp 55
PHP Mdulo II
8utras *un2es Wteis para a manipulao de ar)ui0os te.to#
+&n!*o +eo+
6esta pelo *im de ar)ui0o 3eo*4 em um ponteiro de ar)ui0o%
+&n!*o +:ets
I- uma lin7a de um ponteiro de ar)ui0o e retorna uma strin"% & leitura termina
)uando encontra *im de lin7a ou *im de ar)ui0o%
& se"uir temos um e.emplo )ue utili'a essas duas *un2es#
$%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);
%/
&"-ncia para a >ormao Pro*issional da Unicamp &>PU 5?
PHP Mdulo II
Cap!tulo 5
ExtensFes do "H". paa
ExtensFes do "H". paa
a manip&la!*o de
a manip&la!*o de
doc&mentos H$L
doc&mentos H$L
Ensina a manipular ar)ui0os HMI utili'ando as e.tens2es do PHP%
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp 5@
PHP Mdulo II
&lm de *un2es espec!*icas para a manipulao de ar)ui0os HMI( o PHP@
traal7a com 5 e.tens2es HMI( cada )ual com suas caracter!sticas espec!*icas#
IO$ 3Jocument 8,ect Model4# a e.tenso com mais recursos( porm e.i"e
muito traal7o( mesmo para o HMI mais simples% &lm disso utili'a mais
memria%
0/H 3Gimple &PI *or HMI4# e.tenso ori"inal HMI do PHP% Utili'a menos memria
)ue a J8M( porm( necessita *re)uentemente de cdi"o PHP comple.o%
0impleH$L# essa e.tenso ,1 0em 7ailitada por padro no PHP@% Com ela(
traal7aDse com documentos HMI como se *ossem o,etos nati0os da lin"ua"em
PHP% N mais simples de se usar do )ue as e.tens2es mencionadas anteriormente%
&"ora 0amos saer mais sore os tipos de ar)ui0os com os )uais 0amos
traal7ar%
O <&e % H$L
HMI 3eHtensile MarZup Ian"ua"e4 uma lin"ua"em de marcao )ue permite a
troca de in*orma2es de *orma estruturada atr10es da Internet% N composta por
ta"s 3assim como o H6MI4( s )ue( en)uanto o H6MI traal7a com ta"s prD
de*inidas( o HMI permite )ue o desen0ol0edor crie as suas prprias ta"s de*inindo
assim a sua prpria lin"ua"em de marcao% Um ar)ui0o .ml nada mais do )ue
um ar)ui0o te.to com marca2es( )ue permitem um maior controle sore as
in*orma2es contidas nesse ar)ui0o e )ue *acilitam a troca de dados entre
pro"ramas escritos em lin"ua"ens di*erentes%
H$L +omato ;00
&inda tendo como tema um site de not!cias( 0amos demonstrar como criar um
ar)ui0o HMI no *ormato <GG e como utili'ar a e.tenso GimpleHMI para ler esse
ar)ui0o%
<GG um *ormato de distriuio de in*orma2es pela Internet )ue permite ao
usu1rio ter acesso a not!cias de 01rias *ontes simultaneamente( sem ter )ue
na0e"ar pelos respecti0os sites% Esses ar)ui0os so escritos em HMI e tamm
so con7ecidos como L*eedsM%
Por meio de pro"ramas leitores de <GG( o usu1rio cadastra o endereo do *eed
&"-ncia para a >ormao Pro*issional da Unicamp &>PU 56
PHP Mdulo II
dese,ado e passa a receer as not!cias em seu computador em tempo real( num
procedimento semel7ante ao utili'ado pelos "erenciadores de eDmail%
8s ar)ui0os <GG tra'em um con,unto de ta"s espec!*icas% &s principais so# rss(
channel e item %
& ta" rss a ra!' do documento HMI( contendo todas as demais% Jentro da ta"
rss temos apenas uma ta" channel% Ka ta" channel temos 01rias outras ta"s )ue
tra'em in*orma2es sore o documento rss# /uem o "erou( o )ue contm( data
da "erao( etc% Jentro da ta" channel teremos tamm 01rias ta"s item% Cada
ta" item representa uma not!cia( e composta por outras ta"s )ue descre0em a
not!cia( tais como ttulo( link e descrio%
& se"uir( temos a estrutura 1sica de um ar)ui0o <GG#
<rss>
<channel>
<item>
<title></title>
<link></link>
<description></description>
</item>
<item>
<title></title>
<link></link>
<description></description>
</item>
</channel>
</rss>
Exec3cio:
=amos criar um feed utili'ando PHP e Post"reG/I% Inicialmente( incluiremos
dados numa taela de not!cias atra0s de um *ormul1rio% Em se"uida( um
pro"rama acessar1 esses dados e "erar1 um ar)ui0o HMI no *ormato <GG% Para
*inali'ar( outro pro"rama 0ai ler o *eed e e.iir as not!cias%
Kesse e.erc!cio( utili'aremos os conceitos da P88( 0istos anteriormente%
"asso 1: Ie+ini!*o da base de dados Jcapit&lo'K e da tabela JnoticiaK.
Campos da taela LnoticiaM#
id (serial, chave primria, not null)
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp 5B
PHP Mdulo II
titulo (character varying, 100, not null)
link (character varying, 100, not null)
descricao (text, not null)
data_publ (date, not null)
Obs.: No PostgreSQL utilizamos o parmetro serial para definir um
campo do tipo auto-increment. Ou seja, um campo numrico, cujo valor
ser incrementado automaticamente cada vez que um novo registro for
gravado na tabela.
Criar a estrutura do banco de dados utilizando a ferramenta
PhpPgadmin que faz parte do pacote WAPPStack:
Para acessar o Phppgadmin: http://localhost/phppgadmin/
Username: administrator
Password: adminpgs
Para acessar o banco de dados: no menu do lado esquerdo da
pgina selecionar PostgreSQL, digitar Nome de usurio e Senha:
Nome de usurio: postgres
Senha: adminpgs
Para criar um banco de dados:
No menu do lado esquerdo da pgina selecionar
PostgreSQL
Selecionar a opo Criar banco de dados
Criar o banco de dados: capitulo3
Selecionar codificao: UTF8
Para criar tabelas dentro desse banco de dados:
no menu do lado esquerdo da pgina selecionar o banco
de dados desejado.
Clicar no sinal + que aparece na frente do nome do
banco de dados, para mostrar as opes que esto abaixo
dele
selecionar a opo Tabelas
em seguida selecionar Criar tabela (como mostra a
figura a seguir)
&"-ncia para a >ormao Pro*issional da Unicamp &>PU 5F
PHP Mdulo II
Para importar uma estrutura de banco de dados j existente a
partir de um arquivo de backup do banco (arquivo txt):
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp 5C
PHP Mdulo II
Clique no banco de dados, no menu do lado esquerdo da
pgina
No menu horizontal do Phppgadmin selecione a aba: SQL
Em: or upload an SQL script selecione o arquivo de
backup do banco de dados desejado.
Executar o comando (se aps a execuo aparecer um
aviso de erro na primeira linha na janela do sql, ignorar)
"asso #: Ie+ini!*o das classes
Para esse e.erc!cio criaremos duas classes( )ue *icaro arma'enadas na pasta
classes#
Classe db# utili'ada nos acessos ao anco de dados%
Classe feed# utili'ada na manipulao dos dados do ar)ui0o <GG%
& se"uir( temos a de*inio dessas classes#
db.class.p2p :
&"-ncia para a >ormao Pro*issional da Unicamp &>PU ?0
PHP Mdulo II
$%p&p
' db.cass.p&p
cass db
1
pubic $conexao;

function ((construct($dominio, $usuario, $sen&a, $db)
1
$t&is4/conexao = pg(connect("&ost=$dominio dbname=$db user=$usuario
password=$sen&a");
5
function CB=rror()
1
ec&o pg(ast(error($t&is4/conexao);
5
function insert($tabea, $campos)
1
$decar = "I*D=-? into $tabea (tituo, in", descricao, data(pub)
vaues $campos";
return pg(querE($t&is4/conexao, $decar);
5
function seect($tabea, $campos, $condicao)
1
$decar = "D=;=0? $campos from $tabea $condicao";
return pg(querE ($decar);
5
function deete($tabea, $condicao)
1
$decar = "C=;=?= from $tabea $condicao";
return pg(querE ($decar);
5
function update($tabea, $campos, $condicao)
1
$decar = "F:C2?= $tabea D=? $campos GH=-= $condicao";
return pg(querE ($decar);
5
5
%/
& classe db possui um mtodo construtor )ue *ar1 a cone.o com o anco de
dados assim )ue essa classe *or instanciada% 6amm disponiili'a mtodos )ue
*a'em a incluso( seleo( e.cluso e alterao em taelas%
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp ?$
PHP Mdulo II
+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
%/
Ko mtodo construtor da classe *eed utili'amos a *uno simplexml_load_file(
)ue l- o conteWdo de um ar)ui0o HMI e retorna um o,eto%
Ko mtodo exibeFeed utili'amos o comando foreach( )ue o*erece uma maneira
*1cil de traal7ar com matri'es e *unciona somente com arraTs% 8 foreach 0arre
uma dada matri' e em cada EloopE( o 0alor do elemento corrente atriu!do a uma
0ari10el 3$noticia4 e o ponteiro interno da matri' a0anado em uma posio%
Mais in*orma2es sore essa *uno na p1"ina @$%
&"-ncia para a >ormao Pro*issional da Unicamp &>PU ?2
PHP Mdulo II
"asso ': 4om&l6io paa a entada de dados @+om7noticia.2tmlA
$&tm/
$&ead/
$tite/<ormuLrio$>tite/
$meta &ttp4equiv="0ontent4?Epe" content="text>&tm; c&arset=iso4MMNO4P"/
$>&ead/
$bodE/
$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" tEpe="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"" tEpe="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"/Cescri78o,$>font/$>strong/$>td/
$td widt&="M#S"/$textarea name="descricao" cos="N#" rows="T"
id="descricao"/$>textarea/$>td/
$>tr/
$>tabe/
$p/
$input tEpe="submit" name="Dubmit" vaue="=nviar"/
$>p/
$>form/
$>bodE/
$>&tm/
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp ?5
PHP Mdulo II
&"-ncia para a >ormao Pro*issional da Unicamp &>PU ??
PHP Mdulo II
"asso ,: O scipt incl&i7noticia.p2p +a6 a incl&s*o dos dados ecebidos
pelo +om&l6io na tabela noticia= &tili)ando a classe IL.
$%p&p
' incui(noticia.p&p
incude(once (Jcasses>db.cass.p&pJ);
>> -ecebe dados do formuLrio
$tituo = $(:UD?V"tituo"W;
$in" = $(:UD?V"in""W;
$descricao = $(:UD?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, JpostgresJ, JadminpgsJ, JcapituoYJ);
$inc(not4/CB=rror();
$campos = "(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 H$L @4eedA a pati dos dados da
tabela noticia @:ea7+eed.p2pA. Nesse scipt &tili)aemos as classes JILK
e J/<&i(oK.
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp ?@
PHP Mdulo II
<?php
# gera_feed.php
function __autoload($classe)
{ include_once ("classes/$classe.class.php");
}
// Obtem data atual
$data_atual = date("Y").'-'.date("m").'-'.date("d");
// Instancia um objeto da classe db
$sel_not = new db('localhost', 'postgres', 'adminpgs', 'capitulo3');
$sel_not->DBError();
$condicao = "where data_publ = '$data_atual'";
$result = $sel_not->select('noticia', '*', $condicao);
// Verifica se encontrou algum registro
$row = pg_num_rows($result);
if ($row > 0)
{
// Determina o nome do arquivo XML que ser criado
$arquivo = "feed.xml";
// Instancia um objeto da classe arquivo e abre o arquivo
$arquivo_xml = new arquivo();
$arquivo_xml->abreArq($arquivo,'w');

$conteudo = "<?xml version='1.0' encoding='ISO-8859-1'?>";
$conteudo .= "<rss version='2.0'>";
$conteudo .= '<channel>';
$conteudo .= '<title>Seu Site</title>';
$conteudo .= '<link>http://www.seusite.com.br</link>';
$conteudo .= '<description>Descrio de seu site</description>';
$conteudo .= '<language>pt-br</language>';
$conteudo .= '<copyright>Copyright de seu site</copyright>';
$conteudo .= '<webmaster>webmaster@seusite.com.br</webmaster>';
while ($result2 = pg_fetch_assoc($result)) {
// Monta as tags referentes as noticias
$conteudo .= "<item>";
$conteudo .= "<title>$result2[titulo]</title>";
$conteudo .= "<link>$result2[link]</link>";
$conteudo .= "<description>$result2[descricao]</description>";
$conteudo .= "</item>";
}
//Fecha as tags channel e rss
$conteudo .= '</channel>';
$conteudo .= '</rss>';
$arquivo_xml->gravaArq($conteudo);
$arquivo_xml->fechaArq();
// Mensagem
echo "O arquivo <b>".$arquivo."</b> foi gerado com sucesso !";
}
?>
&"-ncia para a >ormao Pro*issional da Unicamp &>PU ?6
PHP Mdulo II
O scipt :ea7+eed.p2p i6 :ea o a<&i(o J+eed.xmlK com +omato ;00.
O conteGdo desse a<&i(o +ica6 paecido com o cMdi:o a se:&i:
$%xm version="P.#" encoding="IDU4MMNO4P"%/
$rss version="Q.#"/
$c&anne/
$tite/Deu Dite$>tite/
$in"/&ttp,>>www.seusite.com.br$>in"/
$description/Cescri78o de seu site$>description/
$anguage/pt4br$>anguage/
$copErig&t/0opErig&t de seu site$>copErig&t/
$webmaster/webmaster[seusite.com.br$>webmaster/
$item/
$tite/*oticia P$>tite/
$in"/F-; da *ot.cia P$>in"/
$description/Cescri78o da *ot.cia P $>description/
$>item/
$item/
$tite/*oticia Q$>tite/
$in"/ F-; da *ot.cia Q$>in"/
$description/ Cescri78o da *ot.cia Q $>description/
$>item/
$item/
$tite/*oticia n$>tite/
$in"/ F-; da *ot.cia n $>in"/
$description/ Cescri78o da *ot.cia n $>description/
$>item/
$>c&anne/
$>rss/
"asso 1 exec3cio: Cie &m scipt @exibe7noticia.p2pA paa le o +eed
ciado e exibi o se& conteGdo. Utili)e a classe +eed.
& resposta desse e.erc!cio est1 na p1"ina @5%
Obs# &ps testar com sucesso o script exibe7noticia.p2p( passando como
parUmetro o ar)ui0o feed.xml, *aa um no0o teste( dessa 0e' passando como
parUmetro o *eed da >ol7a 8nline Ilustrada%
Url do *eed# 2ttp:NN+eeds.+ol2a.&ol.com.bN+ol2aNil&stadaNssO?1.xml
O&tos ec&sos da extens*o 0impleH$L
8 GimpleHMI tamm disponiili'a outros recursos astante Wteis( como a *uno
simplexmlloadstrin!( utili'ada para ler uma strin" HMI( e a *uno xpath( )ue
permite acessar uma in*ormao espec!*ica dentro de um o,eto%
& se"uir( um e.emplo )ue utili'a essas duas *un2es% Primeiramente(
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp ?B
PHP Mdulo II
trans*ormamos o conteWdo do nosso ar)ui0o feed.xml em uma strin"( com o
au.!lio da *uno implode% Em se"uida lemos essa strin" com a *uno
simplexmlloadstrin! e otemos o t!tulo da primeira not!cia usando xpath#
$%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;
%/
Ko cdi"o acima o xpath 0ai retornar um arraT para a 0ari10el Vresult( contendo
todos os elementos title 3t!tulos4 do ar)ui0o% &o inde.armos a 0ari10el( estamos
escol7endo a posio do arraT )ue )ueremos e.iir%
8s# 6amm podemos ler o nosso ar)ui0o <GG com um dos muitos leitores de
<GG dispon!0eis( s cadastrar o endereo do *eed dese,ado #
>eedreader# 7ttp#[[\\\%*eedreader%com[ 3]indo\s4 Ieitor de not!cias do
67underird# 7ttp#[[\\\%mo'illa%com[t7underird[ 3]indo\s[Iinu.4%
Gites a"re"adores de conteWdo como o Ket0ies 7ttp#[[\\\%net0ies%com[ D
tamm disponiili'am uma inter*ace para a incluso e leitura de *eeds%
&"-ncia para a >ormao Pro*issional da Unicamp &>PU ?F
PHP Mdulo II

Cap!tulo 4
Templates com "OO
Templates com "OO
-ntod&!*o
Em muitos casos( o cdi"o de uma aplicao para a ]e desor"ani'ado(
com muitos cdi"os H6MI e instru2es PHP escritas de )ual)uer ,eito% &liando o
conceito de Pro"ramao 8rientada 9 8,etos a um om plane,amento e
or"ani'ao do seu template( poss!0el dei.ar o cdi"o mais en.uto e
or"ani'ado( *acilitando assim a manuteno das aplica2es%
Keste cap!tulo 0eremos como separar os cdi"os H6MI( CGG e Ra0ascript( do
cdi"o PHP da aplicao%
&o separarmos a camada l"ica 3cdi"o PHP4( da camada de apresentao 3laTout
do site4( possiilitamos )ue pro"ramador e \edesi"ner traal7em de *orma
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp ?C
PHP Mdulo II
independente%
$%$ 8 template
Ko pro,eto *inal utili'aremos um template de um site de not!cias% 8s scripts
re*erentes a esse pro,eto sero disponiili'ados para *ins de estudo% 8 o,eti0o
*ornecer aos alunos um ponto de partida para )ue eles e.ercitem os conceitos
apresentados no treinamento e completem o pro,eto so'in7os%
Ji0idimos o template em B partes#
4i:&a 1.1 Ii(is*o do template do "ojeto 4inal.
&"-ncia para a >ormao Pro*issional da Unicamp &>PU @0
PHP Mdulo II
$% Cabe!al2o# Je*ini2es da p1"ina e ima"ens%
2% $en& # Ka coluna es)uerda encontraDseDse o menu de na0e"ao%
5% Not3cia de E(entos# Ka coluna direita encontramDse as not!cias
re*erentes 9 e0entos importantes%
?% Not3cia "incipal # Kesta seo encontraDse a not!cia principal( a
manc7ete do site%
@% Not3cia do Iia # Kesta seo encontramDse as not!cias do dia )ue
no so manc7etes%
6% Not3cia de Pltima Hoa # Kesta seo encontramDse as not!cias de
Wltima 7ora%
B% ;odap%# in*orma2es sore os respons10eis pelo site e a pol!tica de
pri0acidade da p1"ina%
1.1.# Classes
Noticia.class.p2p : Este script contm a classe Koticia( utili'ada na
maioria dos scripts para manipulao das in*orma2es da p1"ina principal%
template.class.p2p : Contm as classes respons10eis pela manipulao
do template da p1"ina% 6udo )ue est1 relacionado com a apresentao da
p1"ina encontraDse neste script%
dbconnect.p2p : Contm a classe respons10el pela manipulao das
in*orma2es arma'enadas no anco de dados Post"reG/I% /ual)uer
operao com o anco de dados passa por o,etos instanciados desta
classe%
index.p2p : Este script or"ani'a e instancia o,etos )ue esto de*inidos nos
scritps anteriores( e*eti0ando a apresentao da p1"ina principal%
8s# 8s scripts do pro,eto sero disponiili'ados como material complementar%
1.1.' 4&n!Fes
& se"uir( apresentamos al"umas *un2es do PHP )ue sero utili'adas no pro,eto#
-ncl&de7once@A
Inclui um script em p7p na p1"ina( apenas uma 0e'( ou se,a( )uando utili'amos
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp @$
PHP Mdulo II
01rias 0e'es um mesmo script na p1"ina e se por acaso dentro deste script eu
*a'er o uso de outro )ue ,1 *oi usado na 7ierar)uia( o include once ir1 import1Dlo
uma Wnica 0e'% R1 )uando se utili'a o include normal( o script ser1 importado para
cada c7amada%
+oeac2@A

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

8 *oreac7 uma maneira *1cil de se mo0er dentro de um arraT% 8 )ue ele *a'
repetir comandos en)uanto e.istirem elementos dentro de um arraT% E.istem
duas sinta.es para usar o *oreac7( cada uma delas "erando um resultado
di*erente%
$%p&p
$frutas = arraE(JbananaJ,Jma78J,Jmam8oJ,JmangaJ);

>> U fuxo de execu78o vai executar>repetir os comandos igados ao
>> foreac& at acabarem os vaores do arraE $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&s2@A
&"-ncia para a >ormao Pro*issional da Unicamp &>PU @2
PHP Mdulo II
6rata array como uma pil7a( e adiciona as 0ari10eis passadas como ar"umentos
no *inal de array% 8 comprimento de array aumenta de acordo com o nWmero de
0ari10eis adicionadas%
E.emplo de aaQ7p&s2@A
$%p&p
$cesta = arraE("aranIa", "morango");
arraE(pus&($cesta, "meancia", "batata");
print(r($cesta);
%/
Neste caso $stac" teria os seguintes elementos:
2rraE
(
V#W =/ aranIa
VPW =/ morango
VQW =/ meancia
VYW =/ batata
)
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp @5
PHP Mdulo II
;espostas dos exec3cios:
Exec3cio do cap3t&lo # p6:. '#
Xra0ao e leitura de um ar)ui0o te.to utili'ando a classe L&r)ui0oM%
$%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:. ,1
Passo 6 D script e.iePnoticia%p7p
&"-ncia para a >ormao Pro*issional da Unicamp &>PU @?
PHP Mdulo II
$%p&p
' exibe(noticia.p&p
incude(once (Jcasses>feed.cass.p&pJ);
$noticia = new feed(Jfeed.xmJ);
$noticia4/=xibe<eed();
%/
Jiretoria de 6rans*er-ncia 6ecnol"ica Centro de Computao Unicamp @@

Das könnte Ihnen auch gefallen