Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila PHP Avancado PDF
Apostila PHP Avancado PDF
Licenciamento de Uso
Este documento propriedade intelectual 2006 do Centro de Computao da Unicamp e distribudo sob os seguintes termos: 1. As apostilas publicadas pelo Centro de Computao da Unicamp podem ser reproduzidas e distribudas no todo ou em parte, em qualquer meio fsico ou eletrnico, desde que os termos desta licena sejam obedecidos, e que esta licena ou referncia a ela seja exibida na reproduo. 2. Qualquer publicao na forma impressa deve obrigatoriamente citar, nas pginas externas, sua origem e atribuies de direito autoral (o Centro de Computao da Unicamp e seu(s) autor(es)). 3. Todas as tradues e trabalhos derivados ou agregados incorporando qualquer informao contida neste documento devem ser regidas por estas mesmas normas de distribuio e direitos autorais. Ou seja, no permitido produzir um trabalho derivado desta obra e impor restries sua distribuio. O Centro de Computao da Unicamp deve obrigatoriamente ser notificado (treinamentos@ccuec.unicamp.br) de tais trabalhos com vista ao aperfeioamento e incorporao de melhorias aos originais. Adicionalmente, devem ser observadas as seguintes restries: A verso modificada deve ser identificada como tal O responsvel pelas modificaes deve ser identificado e as modificaes datadas Reconhecimento da fonte original do documento A localizao do documento original deve ser citada Verses modificadas no contam com o endosso dos autores originais a menos que autorizao para tal seja fornecida por escrito. A licena de uso e redistribuio deste material oferecida sem nenhuma garantia de qualquer tipo, expressa ou implcita, quanto a sua adequao a qualquer finalidade. O Centro de Computao da Unicamp no assume qualquer responsabilidade sobre o uso das informaes contidas neste material.
PHP Avanado
ndice Captulo 1 Programao Orientada a Objetos............................................... Classes e objetos................................................................................... Herana ....................................................................................... Mtodo construtor e destrutor................................................................ Encapsulamento.................................................................................... Interfaces............................................................................................... Classes abstratas................................................................................... Palavra-chave 'final'............................................................................... Mtodos e propriedades estticas.......................................................... Mtodos mgicos.................................................................................... Captulo 2 Manipulao de arquivos texto..................................................... Captulo 3 Simple XML................................................................................... Captulo 4 Templates com OOP...................................................................... 5 6 7 8 10 13 15 17 19 21 31 35 47
ltimaatualizaoem24/05/2006
PHP Avanado
PHP Avanado
Captulo 1
PHP Avanado
1. Classes e Objetos
Classe a estrutura mais fundamental para a criao de um objeto. Uma classe nada mais que um conjunto organizado de variveis (propriedades ou atributos) e funes (mtodos), que futuramente ser utilizado como um novo tipo e instanciar um objeto. Quando criamos uma classe, temos como objetivo final, a criao de objetos, que nada mais so do que representaes dessa classe em uma varivel. Nosso exemplo ser com a classe Noticia: Exemplo 1.1 Classe Noticia:
<?php # noticia.class.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 = 'Novo curso de PHP Avanado'; $not->texto = 'Este curso contm os seguinte tpicos: POO, XML, etc.'; $not->exibeNoticia(); ?>
PHP Avanado
1.1 Herana
Herana uma forma de reutilizao de cdigo em que novas classes so criadas a partir de classes existentes, absorvendo seus atributos e comportamentos, complementando-os com novas necessidades. O exemplo da vez ser com a classe NoticiaPrincipal: Exemplo 1.1.1 Teste de Herana com a Classe NoticiaPrincipal:
<?php # noticia_heranca.php include_once('noticia.class.php'); class NoticiaPrincipal extends Noticia { public $imagem; function setImagem($valor) { $this->imagem = $valor; } function exibeNoticia() { echo "<center>"; echo "<img src=\"". $this->imagem ."\"><p>"; echo "<b>". $this->titulo ."</b><p>"; echo $this->texto; echo "</center><p>"; } } $not = new NoticiaPrincipal; $not->titulo = 'Vestibular da Unicamp termina nesta quarta-feira'; $not->texto = 'Um dos maiores vestibulares do pas acaba nesta quarta-feira,'; $not->texto .= 'com nmero recorde de inscritos'; $not->imagem = 'img_unicamp.jpg'; $not->exibeNoticia(); ?>
Como mostra o exemplo, a classe NoticiaPrincipal herdou todas as caractersticas da classe Noticia, e ainda foi adicionado o suporte exibio de imagens nas notcias principais. Nestas sub-classes possvel redefinir mtodos, podendo modific-los da forma que o programador quiser, como foi o caso do mtodo exibeNoticia(). Sobrescrever mtodos algo bastante comum no processo de herana, visto que os mtodos que foram criados na classe pai no tm porqu serem os mesmos que os definidos nas classes filhas.
PHP Avanado
Construtor : um mtodo que contm o nome reservado __construct() , e que no precisa ser chamado da forma convencional, pois executado automaticamente quando instanciamos um objeto. Classes que tem um mtodo construtor chamam-no cada vez que um objeto novo criado, por isso, apropriado para qualquer inicializao que o objeto possa vir a precisar antes de ser usado. O mtodo construtor se encarrega de resumir as aes de inicializao dos objetos, como por exemplo, atribuir valores a suas propriedades.
PHP Avanado
E como ficaria a classe filha NoticiaPrincipal com um mtodo construtor? Exemplo 1.2.2 Mtodo construtor na subclasse NoticiaPrincipal:
<?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) { $this->titulo = $valor_tit; $this->text = $valor_text; $this->imagem = $valor_img; } 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>"; } } $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(); ?>
O mtodo construtor da classe Noticia herdado e executado automaticamente na subclasse NoticiaPrincipal. Porm, as caractersticas especficas de NoticiaPrincipal no sero inicializadas pelo mtodo construtor da classe pai. Outro detalhe importante: Caso a subclasse NoticiaPrincipal tenha declarado um mtodo construtor em sua estrutura, este mesmo mtodo da classe Noticia no ser herdado. Mesmo assim podemos utiliz-lo, atravs de uma chamada especfica, como no cdigo abaixo:
Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 9
PHP Avanado
Destrutor : O mtodo destrutor ser chamado assim que todas as referncias a um objeto em particular forem removidas ou quando o objeto for explicitamente destrudo. Como no mtodo construtor, o mtodo destrutor possui um nome reservado, o __destruct(). O exemplo abaixo aplica este conceito na classe Noticia e NoticiaPrincipal:
1.3- Encapsulamento
Este recurso possibilita ao programador restringir ou liberar o acesso s propriedades e mtodos das classes. A utilizao deste recurso s possvel partir do PHP 5. Aplica-se este conceito atravs dos operadores:
Public : Quando definimos uma propriedade ou mtodo como public, estamos dizendo que suas informaes podem ser acessadas diretamente por qualquer script, a qualquer momento. At este momento, todas as propriedades e mtodos das classes que vimos foram definidas desta forma. Protected : Quando definimos em uma classe uma propriedade ou mtodo do tipo protected, estamos definindo que ambos s podero ser acessados pela prpria classe ou por seus herdeiros, sendo impossvel realizar o acesso externo. Private : Quando definimos propriedades e mtodos do tipo private, s a prpria classe pode realizar o acesso, sendo ambos invisveis para herdeiros ou para classes e programas externos.
10
PHP Avanado
A utilizao destes modificadores de acesso encontra-se nos prximos dois exemplos. O primeiro exemplo redefiniu as classes Noticia e NoticiaPrincipal: Exemplo 1.3.1 Utilizao dos modificadores de acesso nas Classes Noticia e NoticiaPrincipal:
<?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>"; } } ?>
11
PHP Avanado
No segundo exemplo, a classe NoticiaUltimaHora criada, e herda as caractersticas da classe NoticiaPrincipal. Exemplo 1.3.2 Utilizao dos modificadores de acesso na Classe NoticiaUltimaHora:
<?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 = $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_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 = 'ComCincia, de roupa nova, discute gentica humana'; $texto = 'A ComCincia, revista eletrnica produzida pelo Laboratrio...'; $not_ulthora = new NoticiaUltimaHora; $not_ulthora->setTitulo($titulo); $not_ulthora->setTexto($texto); $not_ulthora->exibeNoticia(); echo "<pre>"; print_r($not_ulthora); echo "</pre>"; ?>
12
PHP Avanado
1.4- Interfaces
Interfaces permitem a criao de cdigo que especifica quais mtodos uma classe deve implementar, sem ter que definir como esses mtodos sero tratados. Interfaces so definidas utilizando a palavra-chave interface, e devem ter definies para todos os mtodos listados na interface. Classes podem implementar mais de uma interface se desejarem listando cada interface separada por um espao. Dizer que uma classe implementa uma interface e no implementar todos os mtodos na interface resultar em um erro fatal exibindo quais mtodos no foram implementados. Vamos criar uma interface que servir de base para as nossas classes de notcias utilizadas at agora: Exemplo 1.4.1 Interface iNoticia:
<?php # noticia_interface.class.php interface iNoticia { public function setTitulo($valor); public function setTexto($valor); public function exibeNoticia(); } ?>
A implementao desta interface nos exemplos anteriores simples. No cdigo abaixo, utilizamos a nossa interface iNoticia para a classe Noticia e conseqentemente NoticiaPrincipal:
13
PHP Avanado
$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'; $not = new Noticia; $not->setTitulo($titulo); $not->setTexto($texto); $not->exibeNoticia(); echo "<pre>"; print_r($not); echo "</pre>"; ?>
14
PHP Avanado
O exemplo acima nos mostra a utilizao tanto de mtodos abstrato quanto de mtodos comuns. Os mtodos abstratos no devem conter cdigo, apenas definio. Suas aes sero definidas na subclasse que herdar Noticia, no nosso caso NoticiaPrincipal:
15
PHP Avanado
$not = new NoticiaPrincipal; $not->setTitulo($titulo); $not->setTexto($texto); $not->setImagem($imagem); $not->exibeNoticia(); echo "<pre>"; print_r($not); echo "</pre>"; ?>
16
PHP Avanado
17
PHP Avanado
$not = new NoticiaPrincipal; $not->setTitulo($titulo); $not->setTexto($texto); $not->setImagem($imagem); $not->exibeNoticia(); echo "<pre>"; print_r($not); echo "</pre>"; ?>
O teste realizado com estas classes nos traz o seguinte resultado: Fatal error: Class NoticiaPrincipal may not inherit from final class (Noticia)
18
PHP Avanado
19
PHP Avanado
Dentro da classe filha NoticiaPrincipal, a chamada propriedades estticos da classe pai ficaria da seguinte forma:
mtodos
ou
20
PHP Avanado
21
PHP Avanado
Exemplo 1.8.1 Verificando a validando o tamanho dos campos das propriedades $titulo e $texto da classe Noticia:
<?php # noticia_metodo_magico_1.php class Noticia { protected $titulo; protected $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>"; ?>
22
PHP Avanado
__get : Este mtodo pode ser declarado em qualquer classe e ser executado toda vez que for solicitado o retorno do valor de alguma propriedade de um objeto. Como em __set(), este mtodo funciona apenas com as propriedades que estiverem definidas como protected ou private.
23
PHP Avanado
__autoload : Ao criarem aplicaes orientadas objeto, os desenvolvedores colocam a definio de cada classe em um arquivo PHP. Um dos maiores contratempos ter de escrever uma longa lista de includes no incio de cada script (uma chamada para cada classe necessria). No PHP5 isso no mais necessrio. Voc pode definir uma funo __autoload() que automaticamente chamada no caso de voc tentar usar uma classe que ainda no foi definida. Ao chamar essa funo o scripting engine tem uma chance para carregar a classe antes que o PHP falhe com erro. Os prximos dois scripts exemplificam este recurso:
function exibeNoticia() { echo "<center>"; echo "<b>". $this->titulo ."</b><p>"; echo $this->texto; echo "</center><p>"; } } ?>
24
PHP Avanado
Exemplo 1.8.4 Script que utiliza a Classe Noticia, chamando-a atravs 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(); ?>
25
PHP Avanado
__clone : Criar uma cpia de um objeto com propriedades totalmente replicadas nem sempre o comportamento desejado. Caso a instncia de um objeto seja apenas atribuda uma varivel (Exemplo 1.8.5), o objeto no ser clonado, ser apenas criada uma nova referncia a esse objeto (Exemplo 1.8.6):
26
PHP Avanado
Para que o objeto seja realmente clonado, necessrio utilizar a palavrachave clone. E caso o mtodo __clone() esteja definido na classe deste objeto, ele ser executado durante esta clonagem: Exemplo 1.8.7 Executando o mtodo mgico __clone() de Noticia:
<?php # noticia_metodo_magico_6.php class Noticia { public $titulo; public $texto; function exibeNoticia() { echo "<center>"; echo "<b>". $this->titulo ."</b><p>"; echo $this->texto; echo "</center><p>"; } function __clone() { echo "<p>Obj. com o ttulo <b>" . $this->titulo . "</b> Clonado</p>"; } } $not = new Noticia; $not->titulo = "Unicamp 40 anos"; $not->texto = "No ano de 2006 a Unicamp completa 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>"; ?>
27
PHP Avanado
__toString : O mtodo __toString() permite que uma classe decida como se comportar quando convertida para uma string:
28
PHP Avanado
__call : Este mtodo ser chamado toda vez que for solicitada a execuo de algum mtodo inexistente em determinada classe:
29
PHP Avanado
30
PHP Avanado
Captulo 2
31
PHP Avanado
Abertura de arquivo: funo fopen Essa funo retorna um identificador do arquivo que deve ser armazenado em uma varivel para o uso posterior em funes de leitura, gravao e fechamento.
$arquivo="teste.txt"; $abertura=fopen($arquivo,"w");
r : Somente leitura. r+ : Leitura e gravao. Se o arquivo j existir, ir gravar no incio do arquivo. w : Somente gravao. Se o arquivo j existir, ir apagar todo o contedo prvio. w+ : Gravao e Leitura. Se o arquivo j existir, ir apagar todo o contedo prvio. a : Somente gravao. Caso o arquivo exista ir gravar no final do arquivo. a+ : Gravao e leitura. Caso o arquivo exista ir gravar no final do arquivo.
Gravao de arquivo: funo fwrite Essa funo aceita argumentos na forma de um identificador de arquivo e uma string. Retorna o nmero de caracteres gravados.
$conteudo="Istoumteste"; $gravacao=fwrite($abertura,$conteudo);
Leitura de arquivo: funo fread Essa funo aceita um identificador de arquivo e um tamanho do arquivo em bytes como segundo argumento.
32
PHP Avanado
$abertura=fopen($arquivo,"r"); $leitura=fread($abertura,filesize($arquivo));
Fechamento de arquivo: funo fclose Para finalizar o uso de um arquivo, deve-se fech-lo, assim todas as alteraes sero salvas. No necessrio utilizar nenhum argumento alm do prprio identificador do arquivo.
fclose($abertura);
Agora vamos juntar essas quatro funes num nico exemplo: Exemplo
<?php #teste_arquivo.php $arquivo="teste.txt"; $conteudo="Istoumteste"; $abertura=fopen("$arquivo","w+"); $gravacao=fwrite($abertura,$conteudo); echo"Nmerodecaracteresgravados:$gravacao"; fseek($abertura,0); $leitura=fread($abertura,filesize($arquivo)); fclose($abertura); echo"<br>Contedodoarquivo:$leitura"; ?>
33
PHP Avanado
Exerccio Vamos retrabalhar o exemplo acima, seguindo os conceitos da programao orientada a objetos. Crie um script que faa a gravao e leitura em um arquivo, utilizando a classe Arquivo descrita a seguir (resposta na pgina 49).
<?php #arquivo.class.php classArquivo { protected$abertura; protected$gravacao; protected$leitura; functionabreArq($nome_arq,$tipo_abertura) { $this>abertura=fopen("$nome_arq","$tipo_abertura"); } functiongravaArq($conteudo) { $this>gravacao=fwrite($this>abertura,$conteudo); } functionleArq() { $this>leitura=fread($this>abertura,$this>gravacao); } functionfechaArq() { } functionexibeArq() { echo"<br>Contedodoarquivo:".$this>leitura; } } ?> fclose($this>abertura);
34
PHP Avanado
Captulo 3
35
PHP Avanado
Alm de funes especficas para a manipulao de arquivos XML, o PHP5 trabalha com 5 extenses XML, cada qual com suas caractersticas especficas: DOM (Document Object Model): a extenso que tem mais recursos, porm exige muito trabalho, mesmo para o XML mais simples. Tambm utiliza mais memria. SAX (Simple API for XML): extenso original XML do PHP. Utiliza menos memria que a DOM, porm, frequentemente necessita de cdigo PHP complexo. XPath: Essa extenso permite que faamos buscas num documento XML da mesma forma como ocorre numa pesquisa num banco de dados. XSLT (Extensible Stylesheet Language Transformations): uma linguagem utilizada para transformar documentos XML em outros documentos dando uma "cara nova". Na verdade, uma folha de estilo, parecido com o CSS utilizado em pginas HTML. XSLT facilmente compartilhado entre diferentes aplicativos, mas possui uma sintaxe que pode parecer um pouco complicada. SimpleXML: facilita a manipulao de arquivos XML, convertendo-os em objetos, e j vem habilitada por default no PHP5. Com ela, trabalha-se com documentos XML como se fossem objetos nativos da linguagem PHP, evitando a utilizao do padro DOM, bem mais complexo. Nesse treinamento utilizaremos SimpleXML, por ser uma das extenses mais fceis de se trabalhar.
O que XML XML (eXtensible Markup Language) uma linguagem de marcao que permite a troca de informaes de forma estruturada atrves da Internet. composta por tags (assim como o HTML), s que, enquanto o HTML trabalha com tags prdefinidas, o XML permite que o desenvolvedor crie as suas prprias tags. Dessa forma, permite a troca de dados entre programas escritos em diferentes linguagens.
36
PHP Avanado
XML formato RSS Ainda tendo como tema um site de notcias, vamos demonstrar como criar um arquivo XML no formato RSS e como utilizar a extenso SimpleXML para ler esse arquivo. RSS um formato de distribuio de informaes pela Internet que permite ao usurio ter acesso a notcias de vrias fontes simultaneamente, sem ter que navegar pelos respectivos sites. Esses arquivos so escritos em XML e tambm so conhecidos como feeds. Por meio de programas leitores de RSS, o usurio cadastra o endereo do feed desejado e passa a receber as notcias em seu computador em tempo real, num formato semelhante ao dos gerenciadores de e-mail. Os arquivos RSS trazem um conjunto de tags especficas, as principais so: rss, channel e item . A tag rss o root do documento XML, contm todas as demais. Dentro da tag rss temos apenas uma tag channel. Na tag channel temos vrias outras tags que trazem informaes sobre o documento rss: Quem o gerou, o que contm, data da gerao, etc. Dentro da tag channel teremos tambm vrias tags item. Cada tag item representa uma notcia, e conter algumas tags descrevendo a notcia, tal como ttulo, link e descrio. A seguir, temos a estrutura bsica de um arquivo RSS e suas tags principais:
<rss> <channel> <item> <title></title> <link></link> <description></description> </item> <item> <title></title> <link></link> <description></description> </item> </channel> <rss>
Exerccio: Vamos criar o nosso prprio feed, um arquivo XML (padro RSS), utilizando PHP e MySQL. Inicialmente, incluiremos dados numa tabela de notcias, atravs de um formulrio. Em seguida, um programa vai ler esses dados e gerar um arquivo XML no formato RSS. Para finalizar, outro programa vai ler o feed e exibir as notcias.
Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 37
PHP Avanado
Nesse exerccio, utilizaremos os conceitos da Programao Orientada a Objetos, vistos anteriormente. Passo 1: Definio da tabela noticia (base de dados: topico_xml) Campos da tabela: id(int,3,chave,autoincrement) titulo(varchar,100) link(varchar,100) descricao(text) data_publ(date) Passo 2: Definio das classes Para esse exerccio criaremos duas classes, que ficaro armazenadas na pasta classes: Classe DB: utilizada nos acessos ao banco de dados. ClasseFeed: utilizada na manipulao dos dados do arquivo RSS. A seguir, temos a definio dessas classes: db.class.php :
<?php #db.class.php classDB { public$conexao; public$resultado; function__construct($dominio,$usuario,$senha,$db) { $this>conexao=mysql_connect($dominio,$usuario,$senha); mysql_select_db($db,$this>conexao); } functionDBError() { echomysql_error($this>conexao); } functioninsertTab($tab,$campos) { $declar="INSERTinto$tabvalues$campos"; $this>resultado=mysql_query($declar); }
38
PHP Avanado
functionselectTab($tab,$campos,$condicao) { $declar="SELECT$camposfrom$tab$condicao"; $this>resultado=mysql_query($declar); } functiondeleteTab($tab,$condicao) { $declar="DELETEfrom$tab$condicao"; $this>resultado=mysql_query($declar); } functionupdateTab($tab,$campos,$condicao) { $declar="UPDATE$tabSET$camposWHERE$condicao"; $this>resultado=mysql_query($declar); } } ?>
A classe DB possui um mtodo construtor que far a conexo com o banco de dados assim que essa classe for instanciada. Tambm disponibiliza mtodos que fazem a incluso, seleo, excluso e alterao em tabelas.
39
PHP Avanado
feed.class.php :
<?php classFeed { public$obj_feed; function__construct($nome_feed) { $this>obj_feed=simplexml_load_file($nome_feed); } functionexibeFeed() { foreach($this>obj_feed>channel>itemas$noticia) { echo'<br>'; echo$noticia>title.'<br>'; echo"<ahref=\"$noticia>link\"> $noticia>link</a>".'<br>'; echo$noticia>description.'<br>'; } } } ?>
No mtodo construtor da classe feed utilizamos a funo simplexml_load_file, que l o contedo de um arquivo XML e retorna um objeto. No mtodo exibeFeed utilizamos o comando foreach, que oferece uma maneira fcil de trabalhar com matrizes e funciona somente com arrays. O foreach varre uma dada matriz e em cada 'loop', o valor do elemento corrente atribudo a uma varivel ($noticia) e o ponteiro interno da matriz avanado em uma posio.
40
PHP Avanado
41
PHP Avanado
Passo 4: O script inclui_noticia.php far a incluso dos dados recebidos pelo formulrio na tabela noticia, utilizando a classe DB.
<?php #inclui_noticia.php include_once('classes/db.class.php'); //Recebedadosdoformulrio $titulo=$_POST["titulo"]; $link=$_POST["link"]; $descricao=$_POST["descricao"]; //obtemdatadepublicao $data_publ=date("Y").''.date("m").''.date("d"); //InstanciaumobjetodaclasseBD $obj=newDB('localhost','root','unicamp','noticias'); $obj>DBError(); $campos="('','$titulo','$link','$descricao','$data_publ')"; $obj>insertTab('noticia',$campos); if($obj>resultado==1) { echo"InclusaoOK<br><br><ahref=\"form_noticia.html\">Voltar</a>"; } else { echo"ErronaInclusao"; } ?>
42
PHP Avanado
Passo 5: Script que gera o arquivo XML (Feed) a partir dos dados da tabela noticia (gera_feed.php). Nesse script utilizaremos as classes DB e Arquivo.
<?php #gera_feed.php include_once('classes/db.class.php'); include_once('classes/arquivo.class.php'); //obtemdataatual $data_atual=date("Y").''.date("m").''.date("d"); //InstanciaumobjetodaclasseDB $obj=newDB('localhost','root','unicamp','noticias'); $obj>DBError(); $condicao="wheredata_publ='$data_atual'"; $obj>selectTab('noticia','*',$condicao); //Verificaseencontroualgumregistro $row=mysql_num_rows($obj>resultado); if($row>0) { //DeterminaonomedoarquivoXMLquesercriado $arquivo="feed.xml"; //InstanciaumobjetodaclasseArquivo //Abreoarquivo $arquivo_xml=newArquivo(); $arquivo_xml>abreArq($arquivo,'w'); $conteudo="<?xmlversion='1.0'encoding='ISO88591'?>"; $conteudo.="<rssversion='2.0'>"; $conteudo.='<channel>'; $conteudo.='<title>SeuSite</title>'; $conteudo.='<link>http://www.seusite.com.br</link>'; $conteudo.='<description>Descriodeseusite</description>'; $conteudo.='<language>ptbr</language>'; $conteudo.='<copyright>Copyrightdeseusite</copyright>'; $conteudo.='<webmaster>webmaster@seusite.com.br</webmaster>';
43
PHP Avanado
while($result=mysql_fetch_assoc($obj>resultado)) { //Montaastagsreferentesasnoticias $conteudo.="<item>"; $conteudo.="<title>$result[titulo]</title>"; $conteudo.="<link>$result[link]</link>"; $conteudo.="<description>$result[descricao]</description>"; $conteudo.="</item>"; } //Fechaastagschannelerss $conteudo.='</channel>'; $conteudo.='</rss>'; $arquivo_xml>gravaArq($conteudo); $arquivo_xml>fechaArq(); //Mensagem echo"Oarquivo<b>".$arquivo."</b>foigeradocomsucesso!"; } ?>
44
PHP Avanado
O script gera_feed.php ir gerar o arquivo feed.xml com formato RSS. O contedo desse arquivo ficar parecido com o cdigo a seguir:
<?xmlversion="1.0"encoding="ISO88591"?> <rssversion="2.0"> <channel> <title>SeuSite</title> <link>http://www.seusite.com.br</link> <description>Descriodeseusite</description> <language>ptbr</language> <copyright>Copyrightdeseusite</copyright> <webmaster>webmaster@seusite.com.br</webmaster> <item> <title>Noticia1</title> <link>URLdaNotcia1</link> <description>DescriodaNotcia1</description> </item> <item> <title>Noticia2</title> <link>URLdaNotcia2</link> <description>DescriodaNotcia2</description> </item> <item> <title>Notician</title> <link>URLdaNotcian</link> <description>DescriodaNotcian</description> </item> </channel> </rss>
Passo 6 exerccio: Crie um script (exibe_noticia.php) para ler o feed criado e exibir o seu contedo. Utilize a classe feed. Resposta na pgina 50. Obs: Aps testar com sucesso o script exibe_noticia.php, passando como parmetro o arquivo feed.xml, faa um novo teste, dessa vez passando como parmetro o feed da Folha Online Ilustrada. Url do feed: http://feeds.folha.uol.com.br/folha/ilustrada/rss091.xml Outros recursos da extenso SimpleXML O SimpleXML tambm disponibiliza outros recursos bastante teis, como a funo simplexml_load_string, utilizada para ler uma string XML, e a funo xpath, que permite acessar uma informao especfica dentro de um objeto. A seguir, um exemplo que utiliza essas duas funes. Primeiramente, transformamos o contedo do nosso arquivo feed.xml em uma string, com o auxlio da funo implode. Em seguida lemos essa string com a funo simplexml_load_string e obtemos o ttulo da primeira notcia usando xpath:
Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 45
PHP Avanado
No cdigo acima o xpath vai retornar um array para a varivel $result, contendo todos os elementos title (ttulos) do arquivo. Ao indexarmos a varivel, estamos escolhendo a posio do array que queremos exibir. Obs: Tambm podemos ler o nosso arquivo RSS com um dos muitos leitores de RSS disponveis, s cadastrar o endereo do feed desejado : Feedreader: http://www.feedreader.com/ (Windows) Leitor de Thunderbird: http://www.mozilla.com/thunderbird/ (Windows/Linux). notcias do
46
PHP Avanado
Captulo 4
47
PHP Avanado
1. Introduo
Em muitos casos, a escrita de cdigo de uma aplicao para a Web desorganizada, engessada e de difcil compreenso, com muitos cdigos HTML e instrues PHP feitas de qualquer jeito. O impacto disso o rduo trabalho que se tem ao precisar trocar o template da sua aplicao, trocar as chamadas e instrues SQL relacionadas a um banco de dados que ser trocado por outro, entre outros inconvenientes. Utilizando o conceito de Programao Orientada Objeto e um bom planejamento e organizao do seu template, possvel minimizar drasticamente este trabalhoso servio de manuteno de cdigo. Neste captulo utilizaremos um exemplo prtico que ser utilizado em nosso Projeto Final. Este exemplo consiste em mostrar de uma maneira bem simplista e bsica, como separar os cdigos Client Side (HTML, CSS e Javascript), do cdigo PHP de sua aplicao.
48
PHP Avanado
1. Cabealho: Definies da pgina e imagens. 2. Menu : Na coluna esquerda encontra-se-se o menu de navegao. 3. Notcia de Eventos: Na coluna direita encontram-se as notcias referentes eventos importantes. 4. Notcia Principal : Nesta seo encontra-se a notcia principal, a manchete do site. 5. Notcia do Dia : Nesta seo encontram-se as notcias do dia que no so manchetes. 6. Notcia de ltima Hora : Nesta seo encontram-se as notcias de ltima hora. 7. Rodap: informaes sobre os responsveis pelo site e a poltica de privacidade da pgina.
49
PHP Avanado
1.1.2 Cdigos Quatro scripts so necessrios para colocar a pgina principal em funcionamento. Cada um deles desempenha um papel diferete na construo desta pgina. A Figura 1.2 ilustra o funcionamento deste scripts:
Noticia.php : Este script contm a classe Noticia, que ser utilizada na maioria dos scripts para manipulao das informaes da pgina principal. template.class.php : Contm as classes responsveis pela manipulao do template da pgina. Tudo que est relacionado com a apresentao da pgina encontra-se neste script. dbconnect.php : Contm a classe responsvel pela manipulao das informaes que esto armazenadas no banco de dados MySQL. Qualquer operao com o banco de dados passa por objetos instanciados desta classe. index.php : Este script apenas organiza e instancia objetos que esto definidos nos scritps anteriores, efetivando a apresentao da pgina principal.
50
PHP Avanado
Resposta do exerccio do tpico 2 Gravao e leitura de um arquivo texto utilizando a classe Arquivo.
<?php #teste_oo_arquivo.php #objetivo:gravarcontedonumarquivotextoeemseguidaexibiressecontedo //Incluioscriptondefoidefinidaaclasseaserutilizada include_once('classes/arquivo.class.php'); #Inicializavariveisqueseropassadascomoparmetros $arquivo="teste.txt"; $conteudo="Istoumteste"; #Instanciaaclasse $arq=newArquivo(); #Chamaomtododeaberturadearquivo(escrita) $arq>abreArq($arquivo,'w'); #Chamaomtododegravaodearquivo $arq>gravaArq($conteudo); #Chamaomtododeaberturadearquivo(leitura) $arq>abreArq($arquivo,'r'); #Chamaomtododeleituradearquivo $arq>leArq(); #Chamaomtododefechamentodearquivo $arq>fechaArq(); #Chamaomtodoqueexibeocontedodoarquivo $arq>exibeArq(); ?>
51
PHP Avanado
52