Apostila Php Avancado

Embed Size (px)

Citation preview

  • PHP Avanado

    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 ([email protected]) 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.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 2

  • PHP Avanado

    ndice

    Captulo 1 Programao Orientada a Objetos............................................... 4Classes e objetos................................................................................... 5Herana ....................................................................................... 6Mtodo construtor e destrutor................................................................ 7Encapsulamento.................................................................................... 9Interfaces............................................................................................... 12Classes abstratas................................................................................... 14Palavra-chave 'final'............................................................................... 16Mtodos e propriedades estticas.......................................................... 18Mtodos mgicos.................................................................................... 20

    Captulo 2 Manipulao de arquivos texto..................................................... 29Captulo 3 Simple XML................................................................................... 35Captulo 4 Templates com POO...................................................................... 45

    ltima atualizao em 18/05/2009

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 3

  • PHP Avanado

    Captulo 1

    Programao Orientada Programao Orientada Objetos (POO) com PHPObjetos (POO) com PHP

    A orientao objetos uma maneira de programar que modela os processos de programao de uma maneira prxima realidade, tratando a cada componente de um programa como um objeto, com suas caractersticas e funcionalidades. O tratamento de objetos no PHP 5 foi totalmente reescrito, permitindo a utilizao de uma maior quantidade de recursos da POO, melhor performance e mais vantagens na implementao deste tipo de programao.

    A POO tambm possibilita uma maior otimizao e reutilizao do cdigo.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 4

  • PHP Avanado

    1. Classes e Objetos

    Classe a estrutura mais fundamental para a criao de um objeto. Uma classe nada mais do que um conjunto de variveis (propriedades ou atributos) e funes (mtodos), que definem o estado e o comportamento do objeto. Quando criamos uma classe, temos como objetivo final a criao de objetos, que nada mais so do que representaes dessa classe em uma varivel. Para declararmos uma classe, utilizamos a palavra-chave class. Nosso exemplo ser com a classe Noticia:

    Exemplo 1.1 Classe Noticia:

    exibeNoticia();

    ?>

    Obs: como os atributos so do tipo public, podemos atribuir valores diretamente para eles, sem a necessidade de utilizar os mtodos. Para manipularmos variveis na classe, precisamos usar a varivel $this, funes e o separador ->. A classe deve utilizar a varivel $this para referenciar seus prprios mtodos e atributos.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 5

  • PHP Avanado

    1.1 Herana

    Herana uma forma de reutilizao de cdigo em que novas classes so criadas a partir de classes existentes, absorvendo seus atributos e comportamentos, e complementando-os com novas necessidades. O exemplo da vez ser com a classe NoticiaPrincipal:

    Exemplo 1.1.1 Teste de Herana com a Classe NoticiaPrincipal:

    Como mostra o exemplo, a classe NoticiaPrincipal herdou todas as caractersticas da classe Noticia, e ainda foi adicionado o mtodo que d suporte exibio de imagens nas notcias principais. Nessas 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 precisam ser necessariamente os mesmos que os definidos nas classes filhas.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 6

  • PHP Avanado

    1.2 Mtodo Construtor e Destrutor

    Construtor : um mtodo que utiliza o nome reservado __construct() e que no precisa ser chamado da forma convencional, pois executado automaticamente quando instanciamos um objeto a partir de uma classe. Sua utilizao indicada para rotinas de inicializao. O mtodo construtor se encarrega de executar as aes de inicializao dos objetos, como por exemplo, atribuir valores a suas propriedades.

    Exemplo 1.2.1 Mtodo construtor na Classe Noticia:exibeNoticia();

    ?>

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 7

  • PHP Avanado

    E como ficaria a classe filha NoticiaPrincipal com um mtodo construtor?

    Exemplo 1.2.2 Mtodo construtor na subclasse NoticiaPrincipal:

    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. Nesse caso podemos chamar o mtodo construtor da Classe Noticia, atravs de uma chamada especfica: parent::__construct()

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 8

  • 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. O mtodo __destruct executado toda vez que um objeto da classe destrudo pelo fim do script ou atravs da funo unset. Sua funo basicamente zerar variveis, limpar dados de sesses, fechar conexes com banco de dados, etc.

    Como no mtodo construtor, o mtodo destrutor possui um nome reservado, o __destruct(). O exemplo a seguir aplica este conceito na classe Noticia e NoticiaPrincipal:

    Exemplo 1.2.3 Mtodo destrutor:

    function __destruct(){ echo Destruindo objeto...;}

    1.3- Encapsulamento

    Este recurso possibilita ao programador restringir ou liberar o acesso s propriedades e mtodos das classes. A utilizao deste recurso s se tornou possvel partir do PHP 5. Aplica-se este conceito atravs dos operadores:

    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 dessa 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.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 9

  • 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:

    No segundo exemplo, a classe NoticiaUltimaHora criada, e herda as caractersticas da classe NoticiaPrincipal.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 10

  • PHP Avanado

    Exemplo 1.3.2 Utilizao dos modificadores de acesso na Classe NoticiaUltimaHora:

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 11

  • PHP Avanado

    1.4- Interfaces

    Interfaces permitem a criao de cdigo que especifica quais mtodos uma classe deve implementar, sem ter que definir como esses mtodos sero tratados. Interfaces so definidas utilizando a palavra-chave interface, e devem ter definies para todos os mtodos listados na interface. Classes podem implementar mais de uma interface se desejarem, listando cada interface separada por um espao.

    Dizer que uma classe implementa uma interface e no definir todos os mtodos na interface resultar em um erro fatal exibindo quais mtodos no foram implementados. Vamos criar uma interface que servir de base para as nossas classes de notcias utilizadas at agora:

    Exemplo 1.4.1 Interface iNoticia:

    A implementao desta interface simples. No cdigo a seguir utilizamos a nossa interface iNoticia para a classe Noticia e conseqentemente NoticiaPrincipal:

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 12

  • PHP Avanado

    Exemplo 1.4.2 Interface iNoticia implementada na Classe Noticia:

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 13

  • PHP Avanado

    1.5 - Classes Abstratas

    Classes abstratas so classes que no podem ser instanciadas diretamente, sendo necessria a criao de uma sub-classe para conseguir utilizar suas caractersticas. Isso no quer dizer que os mtodos destas classes tambm precisem ser abstratos, isso opcional. J as propriedades no podem ser definidas como abstratas.

    Aqui vemos o conceito de polimorfismo, ou seja, a possibilidade de dois ou mais objetos executarem a mesma ao. Um exemplo prtico seria uma moto e um carro, os dois tem a ao em comum de Frear e Acelerar; em orientao a objetos usamos classes abstratas para dar funcionalidades iguais a objetos diferentes.

    Vamos transformar a classe Noticia em uma classe abstrata e depois herdar suas caractersticas para a sub-classe NoticiaPrincipal. Abaixo, a seqncia de exemplos para demonstrar este recurso:

    Exemplo 1.5.1 Classe Abstrata Noticia

    O exemplo acima nos mostra a utilizao tanto de mtodos abstratos quanto de mtodos comuns. Os mtodos abstratos no devem conter cdigo, apenas definio. Quando criamos um mtodo abstrato, fazemos com que ele seja implementado em todas as classes que herdarem dessa classe abstrata.No exemplo a seguir, os mtodos abstratos sero definidos na sub-classe que herdar Noticia, ou seja, NoticiaPrincipal:

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 14

  • PHP Avanado

    Exemplo 1.5.2 Sub-classe NoticiaPrincipal utilizando a classe abstrata Noticia:

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 15

  • PHP Avanado

    1.6- A palavra-chave 'final'

    Classes definidas com a palavra-chave final no podem ser herdadas por outras classes. Quando um mtodo definido dessa forma, as subclasses que o herdarem no podero sobrescrev-los. Os prximos exemplos mostram a utilizao deste recurso:

    Exemplo 1.6.1 Classe Noticia definida com a palavra-chave final:

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 16

  • PHP Avanado

    Exemplo 1.6.2 Classe NoticiaPrincipal herda caractersticas da classe Noticia:

    O teste realizado com essas classes mostra o seguinte resultado:

    Fatal error: Class NoticiaPrincipal may not inherit from final class (Noticia)

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 17

  • PHP Avanado

    1.7- Mtodos e propriedades estticas Quando definimos mtodos ou propriedades como estticos (utilizando a

    palavra-chave static), estamos permitindo que estes possam ser chamados externamente sem haver a necessidade de estarem no contexto de um objeto, isto , no necessrio instanciar um objeto para poder acess-los. Para ter acesso a uma propriedade esttica dentro do corpo da classe temos que usar a palavra self acompanhada de ::.

    Exemplo 1.7.1 Propriedade $nome_jornal definida como esttica na Classe Noticia:

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 18

  • PHP Avanado

    Quando utilizamos o modificador static em atributos, ao invs de serem alocados n atributos para n objetos, alocado apenas 1 atributo para n objetos, onde todos os objetos tm acesso ao mesmo atributo.

    Dentro da classe filha NoticiaPrincipal, a chamada mtodos ou propriedades estticas da classe pai ficaria da seguinte forma:

    Exemplo 1.7.2 Propriedade $nome_jornal sendo chamada pela sub-classe NoticiaPrincipal:

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 19

  • PHP Avanado

    - Mtodos mgicos

    Mtodos mgicos so mtodos com funcionalidades especficas e que podem ser utilizados de acordo com as nossas necessidades. Continuaremos a utilizar o nosso exemplo das classes de notcias.

    __set : Este mtodo pode ser declarado em qualquer classe e ser executado toda vez que for atribudo algum valor alguma propriedade do objeto. Ou seja, ele intercepta a atribuio de valores propriedades de um objeto. Porm, para que este mtodo funcione, estas propriedades devem estar definidas como protected ou private. Digamos que o ttulo e o texto das nossas notcias devam seguir um tamanho pr-definido. Como fazer esta verificao e atribuir o valor correto nas propriedades automaticamente?

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 20

  • PHP Avanado

    Exemplo 1.8.1 Verificando a validando o tamanho dos campos das propriedades $titulo e $texto da classe Noticia:

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 21

  • 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.

    Exemplo 1.8.2 Retornando o valor da propriedade $titulo com o mtodo __get():

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 22

  • 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 possvel definir uma funo __autoload(), que automaticamente chamada quando se tenta 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:

    Exemplo 1.8.3 Script que contm a definio da Classe Noticia :

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 23

  • PHP Avanado

    Exemplo 1.8.4 Script que utiliza a Classe Noticia, chamando-a atravs de __autoload():

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 24

  • 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):

    Exemplo 1.8.5 Criao de uma referncia para um objeto:

    $not = new Noticia;$not_2 = $not;

    Exemplo 1.8.6 Exemplo com a Classe Noticia:

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 25

  • PHP Avanado

    Para que o objeto seja realmente clonado, necessrio utilizar a palavra-chave 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:

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 26

  • PHP Avanado

    __toString : O mtodo __toString() chamado toda vez que se invoca a funo print ou echo para um objeto. Nesses casos o php retornar um erro. a que entra o mtodo __toString, que pode imprimir informaes relevantes ao objeto. O print_r($objeto) tambm pode ser utilizado.

    Esse mtodo permite que uma classe decida como se comportar quando convertida para uma string:

    Exemplo 1.8.8 Utilizando o mtodo __toString():

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 27

  • PHP Avanado

    __call : Esse mtodo ser chamado toda vez que for solicitada a execuo de algum mtodo inexistente em determinada classe:

    Exemplo 1.8.9 Utilizando o mtodo __call():

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 28

  • PHP Avanado

    Captulo 2

    Manipulao deManipulao de arquivos textoarquivos texto

    Esse captulo aborda de uma maneira fcil e objetiva a manipulao de arquivos texto atravs do PHP.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 29

  • PHP Avanado

    Abertura de arquivo: funo fopen

    Essa funo retorna um identificador do arquivo. Esse identificador deve ser armazenado em uma varivel, pois ser utilizado posteriormente nas funes de leitura, gravao e fechamento do arquivo.

    $arquivo = "teste.txt";$abertura = fopen($arquivo, "w");

    Os modos de abertura so:

    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. Caso o arquivo no exista, ele ser criado. a : Somente gravao. Caso o arquivo exista ir gravar no final do arquivo.

    Caso o arquivo no exista, ele ser criado. a+ : Gravao e leitura. Caso o arquivo exista ir gravar no final do arquivo.

    Caso o arquivo no exista, ele ser criado.

    Gravao de arquivo: funo fwrite

    Essa funo recebe como argumentos o identificador de arquivo (obtido no processo de abertura) e uma string (contedo do arquivo). Retorna o nmero de caracteres gravados.

    $conteudo = "Isto um teste";$gravacao = fwrite($abertura, $conteudo);

    Leitura de arquivo: funo fread

    Essa funo recebe como argumentos o identificador do arquivo (obtido no processo de abertura) e o tamanho do arquivo em bytes como segundo

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 30

  • PHP Avanado

    argumento. Retorna o contedo do arquivo, que deve ser armazenado em uma varivel.Para obter o tamanho do arquivo, pode-se utilizar a funo filesize() ou ento o resultado que retornou da funo de gravao, uma vez que a funo fwrite(), como j vimos, retorna o nmero de caracteres gravados.

    $abertura = fopen($arquivo, "r");$leitura = fread($abertura,filesize($arquivo));

    Reposicionando o ponteiro num determinado registro do arquivo: funo fseek

    Essa funo recebe como argumentos o identificador de arquivo (obtido no processo de abertura) e a posio do arquivo em que deve comear a fazer a leitura (no exemplo abaixo, a posio 0 significa reposicionar o ponteiro no incio do arquivo).

    fseek($abertura, 0);

    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);

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 31

  • PHP Avanado

    No exemplo a seguir, reunimos essas cinco funes num nico script:

    Exerccio

    Reescreva o cdigo acima, seguindo os conceitos da programao orientada a objetos. Utilize a classe arquivo, disponibilizada a seguir.

    A resposta desse exerccio est na pgina 50.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 32

  • PHP Avanado

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 33

  • PHP Avanado

    Outras funes teis para a manipulao de arquivos texto:

    funo feof

    Testa pelo fim de arquivo (eof) em um ponteiro de arquivo.

    funo fgets

    L uma linha de um ponteiro de arquivo e retorna uma string. A leitura termina quando encontra fim de linha ou fim de arquivo.

    A seguir temos um exemplo que utiliza essas duas funes:

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 34

  • PHP Avanado

    Captulo 3

    Extenses do PHP5 paraExtenses do PHP5 paraa manipulao dea manipulao dedocumentos XMLdocumentos XML

    Ensina a manipular arquivos XML utilizando as extenses do PHP.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 35

  • PHP Avanado

    Alm de funes especficas para a manipulao de arquivos XML, o PHP5 trabalha com 3 extenses XML, cada qual com suas caractersticas especficas:

    DOM (Document Object Model): a extenso com mais recursos, porm exige muito trabalho, mesmo para o XML mais simples. Alm disso utiliza mais memria.

    SAX (Simple API for XML): extenso original XML do PHP. Utiliza menos memria que a DOM, porm, necessita frequentemente de cdigo PHP complexo.

    SimpleXML: essa extenso j vem habilitada por padro no PHP5. Com ela, trabalha-se com documentos XML como se fossem objetos nativos da linguagem PHP. mais simples de se usar do que as extenses mencionadas anteriormente.

    Agora vamos saber mais sobre os tipos de arquivos com os quais vamos 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 pr-definidas, o XML permite que o desenvolvedor crie as suas prprias tags definindo assim a sua prpria linguagem de marcao. Um arquivo xml nada mais do que um arquivo texto com marcaes, que permitem um maior controle sobre as informaes contidas nesse arquivo e que facilitam a troca de dados entre programas escritos em linguagens diferentes.

    XML formato RSSAinda 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 procedimento semelhante ao utilizado pelos gerenciadores de e-mail.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 36

  • PHP Avanado

    Os arquivos RSS trazem um conjunto de tags especficas. As principais so: rss, channel e item . A tag rss a raz do documento XML, contendo 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 composta por outras tags que descrevem a notcia, tais como ttulo, link e descrio.A seguir, temos a estrutura bsica de um arquivo RSS:

    Exerccio:

    Vamos criar um feed utilizando PHP e MySQL. Inicialmente, incluiremos dados numa tabela de notcias atravs de um formulrio. Em seguida, um programa acessar esses dados e gerar um arquivo XML no formato RSS. Para finalizar, outro programa vai ler o feed e exibir as notcias. Nesse exerccio, utilizaremos os conceitos da Programao Orientada a Objetos, vistos anteriormente.

    Passo 1: Definio da tabela noticia - base de dados: capitulo3. Utilize a ferramenta PhPMyAdmin.

    Campos da tabela:

    id (int, 3, chave, auto-increment)titulo (varchar, 100)link (varchar, 100)descricao (text)data_publ (date)

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 37

  • PHP Avanado

    Passo 2: Definio das classesPara esse exerccio criaremos duas classes, que ficaro armazenadas na pasta classes:Classe db: utilizada nos acessos ao banco de dados.Classe feed: utilizada na manipulao dos dados do arquivo RSS.

    A seguir, temos a definio dessas classes:

    db.class.php :

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 38

  • PHP Avanado

    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.

    feed.class.php :

    obj_feed->channel->item as $noticia ){

    echo '';echo $noticia->title . '';echo "$noticia->link".'';echo $noticia->description . '';

    }}

    }?>

    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.

    Mais informaes sobre essa funo na pgina 48.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 39

  • PHP Avanado

    Passo 3: Formulrio para a entrada de dados (form_noticia.html)

    Formulrio

    Inserir Notcias

    Ttulo: Link: Descrio:

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 40

  • 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 Avanado

    abreArq($arquivo,'w');

    $conteudo = "";$conteudo .= "";$conteudo .= '';$conteudo .= 'Seu Site';$conteudo .= 'http://www.seusite.com.br';$conteudo .= 'Descrio de seu site';$conteudo .= 'pt-br';$conteudo .= 'Copyright de seu site';$conteudo .= '[email protected]';

    while ($result2 = mysql_fetch_assoc($result)) {

    // Monta as tags referentes as noticias$conteudo .= "";$conteudo .= "$result2[titulo]";$conteudo .= "$result2[link]";$conteudo .= "$result2[descricao]";$conteudo .= "";

    }

    //Fecha as tags channel e rss$conteudo .= '';$conteudo .= '';

    $arquivo_xml->gravaArq($conteudo);$arquivo_xml->fechaArq();

    // Mensagemecho "O arquivo ".$arquivo." foi gerado com sucesso !";

    }

    ?>O script gera_feed.php ir gerar o arquivo feed.xml com formato RSS.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 42

  • PHP Avanado

    O contedo desse arquivo ficar parecido com o cdigo a seguir:

    Seu Sitehttp://www.seusite.com.brDescrio de seu sitept-brCopyright de seu [email protected]

    Noticia 1URL da Notcia 1Descrio da Notcia 1

    Noticia 2 URL da Notcia 2 Descrio da Notcia 2

    Noticia n URL da Notcia n Descrio da Notcia n

    Passo 6 exerccio: Crie um script (exibe_noticia.php) para ler o feed criado e exibir o seu contedo. Utilize a classe feed.

    A resposta desse exerccio est 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 43

  • PHP Avanado

    xpath('/rss/channel/item/title');echo $result[0];

    ?>

    No cdigo acima o xpath vai retornar um array para a varivel $result, contendo todos os elementos title (ttulos) do arquivo. Ao indexarmos a varivel, estamos escolhendo a posio do array que queremos exibir.Obs: Tambm podemos ler o nosso arquivo RSS com um dos muitos leitores de RSS disponveis, s cadastrar o endereo do feed desejado :

    Feedreader: http://www.feedreader.com/ (Windows) Leitor de notcias do Thunderbird: http://www.mozilla.com/thunderbird/ (Windows/Linux).

    Sites agregadores de contedo como o Netvibes http://www.netvibes.com/ - tambm disponibilizam uma interface para a incluso e leitura de feeds.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 44

  • PHP Avanado

    Captulo 4

    Templates com POOTemplates com POO

    Introduo

    Em muitos casos, o cdigo de uma aplicao para a Web desorganizado, com muitos cdigos HTML e instrues PHP escritas de qualquer jeito. Aliando o conceito de Programao Orientada Objetos a um bom planejamento e organizao do seu template, possvel deixar o cdigo mais enxuto e organizado, facilitando assim a manuteno das aplicaes.

    Neste captulo veremos como separar os cdigos HTML, CSS e Javascript, do cdigo PHP da aplicao.

    Ao separarmos a camada lgica (cdigo PHP), da camada de apresentao (layout do site), possibilitamos que programador e webdesigner trabalhem de forma independente.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 45

  • PHP Avanado

    1.1 O template

    No projeto final utilizaremos um template de um site de notcias. Os scripts referentes a esse projeto sero disponibilizados para fins de estudo. O objetivo fornecer aos alunos um ponto de partida para que eles exercitem os conceitos apresentados no treinamento e completem o projeto sozinhos.

    Dividimos o template em 7 partes:

    Figura 1.1 Diviso do template do Projeto Final.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 46

  • 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.

    1.1.2 Classes

    Noticia.class.php : Este script contm a classe Noticia, 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 armazenadas no banco de dados MySQL. Qualquer operao com o banco de dados passa por objetos instanciados desta classe.

    index.php : Este script organiza e instancia objetos que esto definidos nos scritps anteriores, efetivando a apresentao da pgina principal.

    Obs: Os scripts do projeto sero disponibilizados como material complementar.

    1.1.3 Funes

    A seguir, apresentamos algumas funes do PHP que sero utilizadas no projeto:

    Include_once()

    Inclui um script em php na pgina, apenas uma vez, ou seja, quando utilizamos vrias vezes um mesmo script na pgina e se por acaso dentro deste script eu fazer o uso de outro que j foi usado na hierarquia, o include once ir import-lo uma nica vez. J quando se utiliza o include normal, o script ser importado para cada chamada.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 47

  • PHP Avanado

    foreach() foreach ($array as $valor) { comandos } foreach ($array as $chave => $valor) { comandos } O foreach uma maneira fcil de se mover dentro de um array. O que ele faz repetir comandos enquanto existirem elementos dentro de um array. Existem duas sintaxes para usar o foreach, cada uma delas gerando um resultado diferente.

    array_push()

    Trata array como uma pilha, e adiciona as variveis passadas como argumentos no final de array. O comprimento de array aumenta de acordo com o nmero de variveis adicionadas.

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 48

  • PHP Avanado

    Exemplo de array_push()

    Neste caso $stack teria os seguintes elementos: Array( [0] => laranja [1] => morango [2] => melancia [3] => batata)

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 49

  • PHP Avanado

    Respostas dos exerccios:Exerccio do captulo 2 pg. 32Gravao e leitura de um arquivo texto utilizando a classe Arquivo.

    Exerccio do captulo 3 pg. 43Passo 6 - script exibe_noticia.phpExibeFeed();

    ?>

    Diretoria de Transferncia Tecnolgica Centro de Computao Unicamp 50

    Licenciamento de Usondice

    Abertura de arquivo: funo fopenLeitura de arquivo: funo freadReposicionando o ponteiro num determinado registro do arquivo: funo fseekFechamento de arquivo: funo fclosefuno feoffuno fgets