Programação I - PHP
Programação I - PHP
Programação I - PHP
Carlos Sica
PROGRAMAO I (PHP)
MARING-pr 2013
Reitor: Wilson de Matos Silva Vice-Reitor: Wilson de Matos Silva Filho Pr-Reitor de Administrao: Wilson de Matos Silva Filho Pr-Reitor de EAD: Willian Victor Kendrick de Matos Silva Presidente da Mantenedora: Cludio Ferdinandi
C397 CENTRO UNIVERSITRIO DE MARING. Ncleo de Educao a Distncia: Programao I (PHP) / Carlos Sica. Maring - PR, 2013. 193 p. Curso de Graduao em Sistemas para Internet EaD.
As imagens utilizadas neste livro foram obtidas a partir dos sites PHOTOS.COM e SHUTTERSTOCK.COM.
Av. Guedner, 1610 - Jd. Aclimao - (44) 3027-6360 - CEP 87050-390 - Maring - Paran - www.cesumar.br NEAD - Ncleo de Educao a Distncia - bloco 4 - (44) 3027-6363 - [email protected] - www.ead.cesumar.br
PROGRAMAO I (PHP)
Professor Me. Carlos Sica
Fonte: SHUTTERSTOCK.COM
APRESENTAO DO REITOR
Viver e trabalhar em uma sociedade global um grande desafio para todos os cidados. A busca por tecnologia, informao, conhecimento de qualidade, novas habilidades para liderana e soluo de problemas com eficincia tornou-se uma questo de sobrevivncia no mundo do trabalho. Cada um de ns tem uma grande responsabilidade: as escolhas que fizermos por ns e pelos nossos far grande diferena no futuro. Com essa viso, o Centro Universitrio Cesumar assume o compromisso de democratizar o conhecimento por meio de alta tecnologia e contribuir para o futuro dos brasileiros. No cumprimento de sua misso promover a educao de qualidade nas diferentes reas do conhecimento, formando profissionais cidados que contribuam para o desenvolvimento de uma sociedade justa e solidria , o Centro Universitrio Cesumar busca a integrao do ensino-pesquisa-extenso com as demandas institucionais e sociais; a realizao de uma prtica acadmica que contribua para o desenvolvimento da conscincia social e poltica e, por fim, a democratizao do conhecimento acadmico com a articulao e a integrao com a sociedade. Diante disso, o Centro Universitrio Cesumar almeja ser reconhecida como uma instituio universitria de referncia regional e nacional pela qualidade e compromisso do corpo docente; aquisio de competncias institucionais para o desenvolvimento de linhas de pesquisa; consolidao da extenso universitria; qualidade da oferta dos ensinos presencial e a distncia; bem-estar e satisfao da comunidade interna; qualidade da gesto acadmica e administrativa; compromisso social de incluso; processos de cooperao e parceria com o mundo do trabalho, como tambm pelo compromisso e relacionamento permanente com os egressos, incentivando a educao continuada. Professor Wilson de Matos Silva Reitor
PROGRAMAO I (PHP) | Educao a Distncia
Seja bem-vindo(a), caro(a) acadmico(a)! Voc est iniciando um processo de transformao, pois quando investimos em nossa formao, seja ela pessoal ou profissional, nos transformamos e, consequentemente, transformamos tambm a sociedade na qual estamos inseridos. De que forma o fazemos? Criando oportunidades e/ou estabelecendo mudanas capazes de alcanar um nvel de desenvolvimento compatvel com os desafios que surgem no mundo contemporneo. O Centro Universitrio Cesumar mediante o Ncleo de Educao a Distncia, o(a) acompanhar durante todo este processo, pois conforme Freire (1996): Os homens se educam juntos, na transformao do mundo. Os materiais produzidos oferecem linguagem dialgica e encontram-se integrados proposta pedaggica, contribuindo no processo educacional, complementando sua formao profissional, desenvolvendo competncias e habilidades, e aplicando conceitos tericos em situao de realidade, de maneira a inseri-lo no mercado de trabalho. Ou seja, estes materiais tm como principal objetivo provocar uma aproximao entre voc e o contedo, desta forma possibilita o desenvolvimento da autonomia em busca dos conhecimentos necessrios para a sua formao pessoal e profissional. Portanto, nossa distncia nesse processo de crescimento e construo do conhecimento deve ser apenas geogrfica. Utilize os diversos recursos pedaggicos que o Centro Universitrio Cesumar lhe possibilita. Ou seja, acesse regularmente o AVA Ambiente Virtual de Aprendizagem, interaja nos fruns e enquetes, assista s aulas ao vivo e participe das discusses. Alm disso, lembre-se que existe uma equipe de professores e tutores que se encontra disponvel para sanar suas dvidas e auxili-lo(a) em seu processo de aprendizagem, possibilitando-lhe trilhar com tranquilidade e segurana sua trajetria acadmica. Ento, vamos l! Desejo bons e proveitosos estudos! Professora Ktia Solange Coelho Coordenadora de Graduao do NEAD - UniCesumar
APRESENTAO
Livro: PROGRAMAO I (PHP)
Professor Me. Carlos Sica
Ol, Meu nome Carlos Sica, mas meus alunos e amigos me chamam de Professor Sica. Eu ensino programao para computadores h muitos anos, conheo vrias linguagens de programao, mas desenvolvi certa paixo pela programao para a Internet. Eu j escrevi 5 livros didticos, dos quais 3 so sobre PHP, e agora eu escrevi 2 especialmente para o seu curso. Estes 2 livros didticos dividem o contedo do curso da seguinte forma: com o primeiro voc vai aprender as linguagens HTML e PHP at trabalhar com arquivos e, no segundo, vai aprender como programar em PHP para desenvolver aplicaes com banco de dados, JavaScript, AJAX, imagens, e uma srie de outras aplicaes interessantes, inclusive a aplicao de cookies e sesses nos sistemas mais profissionais. Eu preparei estes contedos para voc ler como se estivesse navegando em guas calmas, espero que sejam teis e contribuam para sua formao profissional. Faa bom uso!
Vou comear contando pra voc como a linguagem PHP foi concebida.
PROGRAMAO I (PHP) | Educao a Distncia
Fonte: SHUTTERSTOCK.com
Em 1994, Rasmus Lerdorf, que membro da comunidade Apache, escreveu a primeira verso do interpretador PHP em Perl para funcionar como um CGI (Common Gateway Interface), que o mtodo usado para permitir a interao entre o servidor e os clientes. Ela foi criada para ser utilizada exclusivamente na Internet e no comeo tinha o objetivo de criar pginas pessoais com funcionalidades maiores que as fornecidas pela linguagem de marcao HTML, por isso o nome Personal Home Page, que significa Pgina Pessoal. Devido grande propagao dessa linguagem, Rasmus disponibilizou uma parte da documentao para o pblico, dando, assim, origem ao PHP v.01. Em seguida, foi adicionado um sistema para a interpretao de formulrios, dando origem ao PHP/FI (Form Interpreter). A partir da, novos colaboradores foram surgindo e a linguagem PHP vem demonstrando uma constante evoluo. Agora ela aceita todas as estruturas de programao conhecidas e tambm a melhor linguagem para quem trabalha com banco de dados, alm disso, conta com um respeitvel suporte para a programao orientada a objetos. Dado o desenvolvimento da Internet, bem como o da prpria linguagem, o PHP ocupa um importante espao no setor de desenvolvimento de sistemas para a Web, em especial para empresas de pequeno e mdio porte que desejam sistemas computacionais completos, mas tambm para as empresas de grande porte que desejam scripts que integrem seu sistema. A Linguagem PHP apresenta a melhor curva de aprendizagem e, aliada a outras tecnologias, se tornou a maior arma para o desenvolvimento de sistemas computacionais para a Internet. A velocidade de concepo de softwares a coloca em primeiro lugar na maioria das empresas desenvolvedoras, e, tambm, cada vez mais ensinada nas universidades de todo o mundo. Este livro com contedo didtico sobre PHP traz um rico conjunto de exemplos para aqueles que esto iniciando com a linguagem. Vamos aprender juntos a programar em PHP e criar aplicativos especficos voltados para matemtica bsica e cientfica, gravao de dados em fichrios tipo arquivos e muito mais.
Um bom programa deve ser escrito com muita tcnica, mas tambm com esttica. Um cdigo-fonte desorganizado traz prejuzos tanto para o programador como para a empresa, portanto, sempre siga as orientaes deste livro risca e voc se tornar um bom programador.
Sumrio
UNIDADE I A LINGUAGEM HTML Os elementos <head> e <title>....................................................................................17 O elemento <body>...........................................................................................................18 Ttulos do tipo cabealho intituladores.............................................................19 Formatao de pargrafos e quebras de linha.................................................19 LIGAES DENTRO DA PGINA E COM OUTRAS PGINAS.............................................20 Formatao de texto......................................................................................................22 TABELAS.................................................................................................................................24 LISTAS.....................................................................................................................................25 IMAGENS.................................................................................................................................29 FORMULRIOS ELETRNICOS X PHP................................................................................31 SOBRE UPLOADS DE ARQUIVOS.........................................................................................41 ESTUDO DIRIGIDO.................................................................................................................44 UNIDADE II A LINGUAGEM PHP INICIANDO COM A LINGUAGEM PHP...................................................................................51 TIPOS DE DADOS SUPORTADOS PELO PHP......................................................................54 Cadeias de Caracteres (strings)...............................................................................56
Arranjos de dados (arrays)........................................................................................60 VARIVEIS...............................................................................................................................68 CONSTANTES.........................................................................................................................80 OPERADORES........................................................................................................................81 ESTUDO DIRIGIDO.................................................................................................................87 UNIDADE III ESTRUTURAS DE PROGRAMAO ESTRUTURAS DE DECISO E SELEO.............................................................................95 ESTRUTURAS DE ITERAO (LAOS DE REPETIO)...................................................101 COMANDOS DE DESVIO......................................................................................................109 ESTUDO DIRIGIDO............................................................................................................... 115 UNIDADE IV PROGRAMAO MODULAR FUNO................................................................................................................................120 FUNES DEFINIDAS PELO USURIO..............................................................................123 FUNES RECURSIVAS......................................................................................................135 ALGUMAS APLICAES......................................................................................................140 ALGUMAS FUNES DA BIBLIOTECA PHP.......................................................................143 ESTUDO DIRIGIDO...............................................................................................................145
UNIDADE V ARQUIVOS TIPOS DE ARQUIVOS ..........................................................................................................153 OPERAES SOBRE ARQUIVOS.......................................................................................156 OPERAES DENTRO DOS ARQUIVOS............................................................................161 TIPOS DE DADOS EM ARQUIVOS BINRIOS....................................................................176 COMO PRODUZIR NMEROS PARA SEREM ARMAZENADOS EM ARQUIVOS BINRIOS. ...............................................................................................................................................178
CONCLUSO.........................................................................................................................187 REFERNCIAS......................................................................................................................192
UNIDADE I
A LINGUAGEM HTML
Professor Me. Carlos Sica Objetivos de Aprendizagem Aprender a linguagem HTML. Aprender a construir formulrios. Aprender a criar a apresentao de uma pgina web. Plano de Estudo A seguir, apresentam-se os tpicos que voc estudar nesta unidade: Conceitos iniciais da linguagem HTML Conceitos de hipertexto e hiperlink Tabelas Formulrios eletrnicos e preparao dos dados para envio na Internet
INTRODUO
Todo documento HTML apresenta elementos entre colchetes angulares < e >, tambm utilizados na matemtica como sinal de menor e maior, respectivamente. Esses elementos em conjunto e entre os citados sinais formam as etiquetas (tags) da linguagem HTML, que so justamente os comandos de formatao do texto. A maioria das etiquetas tem sua correspondente de fechamento precedida por uma barra (<etiqueta>...</etiqueta>). Isso necessrio porque as etiquetas servem para definir a formatao de trechos do texto. O cdigo-fonte desta linguagem como um todo delimitado pelo par de etiquetas <html>... </html>, e dentro delas vo as outras tags, como no exemplo abaixo:
<html> <head> <title> Ttulo do documento </title> </head> <body> Corpo do Documento </body> </html>
17
O elemento <body>
O texto contido na delimitao do par <body>...</body> o texto que ser apresentado ao leitor, mostrado na janela principal do navegador. Esse corpo pode conter ttulos de itens e subitens (cabealhos), pargrafos, listas, tabelas, formulrios, ligaes (links) para outros documentos, imagens, sons etc.
<html> <head> <title> Curso de PHP e HTML </title> <body> <h1>Curso completo da linguagem HTML</h1> <p> Escrever um documento na linguagem HTML muito simples. Para pular uma linha basta encerrar o pargrafo. </p> <p> Mas cuidado, no importa onde se quebra a linha no documento original, o que vale a formatao da linguagem. </p>
</head>
</html>
</body>
18
19
Por fim, deve-se utilizar uma destas trs etiquetas quando desejado que a linha seja forosamente quebrada em determinado ponto, porque os navegadores se encarregam de encaixar os textos contidos nos pargrafos dentro dos limites de sua janela.
Sendo que HREF significa que a seguir vem uma referncia ao endereo de destino, que pode ser no prprio texto, em outro do mesmo servidor ou externo. Existem trs tipos de ligao com o documento destino: relativo, absoluto e trechos de documentos. Caminho relativo O caminho relativo pode ser usado sempre que se deseja fazer referncia a um documento que esteja no mesmo servidor do documento corrente. Para escrever um link de um documento desse tipo, basta escrever o caminho a partir do diretrio-raiz onde est o documento corrente, por exemplo:
<a href = apostila.html>Leia a apostila sobre HTML</a> <a href = ../inicial.html>Volte ao menu principal</a>
20
Caminho absoluto Utiliza-se o caminho absoluto quando se almeja referenciar um documento que esteja em outro servidor, em qualquer lugar do mundo.
<a href = http://www.cesumar.br>Visite a pgina do CESUMAR</a>
Caminho para um ponto do documento Neste caso, alm do atributo href, que indica o endereo de um documento de destino em uma ligao de hipertexto, a etiqueta <a> possui o atributo name que permite indicar um ponto do documento ativo como alvo de chegada de uma ligao. Esse recurso permite criar um ndice no incio do documento e desviar a leitura para cada ponto especificado. O exemplo abaixo "batiza" o ponto escrito como alvo de chegada.
<a name=formularios>17.7 Formulrios Eletrnicos x PHP</a>
O ponto de partida deve enderear o rtulo atribudo em name, precedido por um sinal #.
<a href=#formularios>17.7 Formulrios Eletrnicos x PHP</a>
href=#formularios
name=formularios
Destino
Fonte: o autor
A juno desta tcnica com a do caminho absoluto pode ser utilizada para apontar e chegar ao alvo especifi cado em outro documento.
21
Formatao de texto
Existem dois tipos de formatao HTML: lgica e fsica. Na primeira, a lgica, quando se formata um trecho do texto, por exemplo, o cabealho de nvel 1 (<h1>...</h1>), no so especificadas as caractersticas da fonte, como o tipo, justificao, cor, tamanho etc., porque o navegador se encarrega de ajustar todos esses detalhes de acordo com sua configurao. Alm dos cabealhos utilizados para intitular os itens e subitens, existe a formatao por meio da aplicao das etiquetas <pre>...</pre>, que apresentam o texto da mesma forma que foi digitado; as etiquetas <blockquote>...</blockquote>, que criam um trecho de texto indentado direita; e as etiquetas <address>...</address>, que apresentam o texto delimitado em um formato semelhante aos endereos dos links. Na segunda, a fsica, o estilo do texto deve ser explicitado e o navegador no tem controle sobre ele. Os mais utilizados so o negrito (<b>...</b>) e o itlico (<i>...</i>), mas com a etiqueta <font>...</font> pode-se detalhar a formatao do texto. Caracteres especiais A linguagem HTML permite que caracteres especiais, utilizados para o controle do texto, tais como <, > e &, sejam apresentados na tela com a utilizao de sequncias de escape, sensveis caixa (masculas e minsculas so diferentes), compostos por trs partes: um & inicial; um nome ou um nmero que representa o cdigo ASCII precedido pelo smbolo #; e uma sequncia que representa a ao finalizada por ;.
22
&
º ¸ ´ &Acute; â Â &agrav; À ã Ã &ccdil; ü Ü → ← ↑ ↓ Idem para as vogais e, i, o u. Ç
Caractere apresentado < > & o ... espao em branco seta para a direita seta para a esquerda seta para cima seta para baixo
Fonte: o autor
A maioria dos editores de texto atuais permite acentuar palavras diretamente e o navegador, quando configurado corretamente, mostra-nas de modo adequado. Porm, se a pgina for vista por outros pases, podem ocorrer problemas de apresentao.
23
TABELAS
Uma tabela delimitada pelas etiquetas <table>...</table>, as linhas pelas etiquetas <tr>... </tr> e as colunas por <td>...</td>. Podem-se utilizar tambm as etiquetas <th>...</th> para criar uma linha destacada simbolizando o cabealho da tabela. O atributo border define a largura das linhas que desenham a tabela, comeando pela mais fina que 1, porm, o valor 0 (zero) inibe a apresentao das linhas. Caso esse atributo seja omitido, o navegador assumir 1 como padro.
<table border=1> <th>Coluna 1</th><th>Coluna 2</th> <tr><td>linha 1, coluna 1</td><td>linha 1, coluna 2</td></tr> <tr><td>linha 2, coluna 1</td><td>linha 2, coluna 2</td></tr> </table>
Resultado: Coluna 1 Coluna 2 linha 1, coluna 1 linha 1, coluna 2 linha 2, coluna 1 linha 2, coluna 2
Fonte: o autor
Como recurso adicional, possvel dividir as colunas e linhas aplicando os atributos colspan e rowspan.
<table border=1> <tr> <td colspan=2>Tabela com 2 colunas</td> </tr> <tr> <td>linha 1, coluna 1</td> 2</td> </tr> <td>linha 1, coluna
<tr> <td rowspan=2>linha 2 e 3, coluna 1</td> <td>linha 2, coluna 2</td> </tr> <tr> 2</td> </tr> <tr> <td>linha 4, coluna 1</td> 2</td> </tr> </table> <td>linha 3, coluna <td>linha 2, coluna
24
O resultado uma tabela com duas linhas Tabela com duas linhas Linha 1, coluna 1 Linha 1, coluna 2 Linha 2, coluna 2 Linhas 2 e 3, coluna 1 Linha 3, coluna 2 Linha 4, coluna 1 Linha 4, coluna 2
Fonte: o autor
LISTAS
As listas podem ser utilizadas para destacar os seus itens, por endentao, bolotas, nmeros etc. Listas de definio Entenda os itens: Corpo do texto
<dl> <dt> Termo a ser definido 1</dt> <dd> Definio 1 <dt> Termo a ser definido 2</dt> <dd> Definio 2 </dl>
Fonte: o autor
Listas de itens Neste tipo de lista, cada item pode ser marcado ou no com bolotas:
25
Corpo do texto
<ul> item da lista sem marca <li>item da lista marcado</li> <ul> <li>subitem</li> </ul> </ul>
Fonte: o autor
Listas de itens numerados As marcas simples utilizadas para evidenciar um item podem ser substitudas pela numerao automtica. Corpo do texto
<ol> <li>primeiro item da lista numerada</li> <li>segundo item da lista numerada</li> <li>terceiro item da lista numerada</li> </ol>
Resultado 1. primeiro item da lista numerada 2. segundo item da lista numerada 3. terceiro item da lista numerada
Fonte: o autor
26
Resultado termo a ser definido definio item de uma lista numerada item de uma lista numerada subitem item de uma lista numerada termo a ser definido definio
Fonte: o autor
27
<ul type=circle> <li>item de uma lista</li> <li>item de uma lista</li> </ul> <ul type=square> <li>item de uma lista</li> <li type=circle>item de uma lista</ li> </ul>
item de uma lista item de uma lista item de uma lista item de uma lista
Fonte: o autor
Resultado i. item da lista ii. item da lista I. item da lista II. item da lista a. item da lista b. item da lista A. item da lista B. item da lista
Fonte: o autor
28
IMAGENS
As etiquetas que permitem exibir uma imagem no navegador so <img> e no exigem fechamento, porque o nico atributo exigido o nome do arquivo fonte que guarda a imagem. Neste caso, o caminho completo mais indicado. O atributo src, abreviao de source, do ingls fonte.
<img src=foto.jpg>
A notao preferencial para este caso e de outras etiquetas que no exigem fechamento a seguinte:
<img src=foto.jpg />
Atributos para alinhar a imagem Para alinhar o texto adjacente com o topo da imagem, com o meio da imagem e com a base da imagem, respectivamente, utilize:
<img src=foto.jpg align=top> <img src=foto.jpg align=middle> <img src=foto.jpg align=bottom>
Para alinhar a imagem direita, envolvida por tudo o que houver ao redor (texto e outras imagens), a partir do topo da imagem, utilize:
<img src=foto.jpg align=right>
Para exibir duas imagens, uma em cada margem de uma mesma linha, deve-se definir um pargrafo, indicando o lado de cada imagem com o atributo align.
<p> <img src=foto.jpg align=right> <img src=foto.jpg align=left> </p>
29
Atributo para definir o tamanho da imagem Os atributos largura (width) e altura (height) determinam o tamanho em pixels da apresentao, independentemente do tamanho original da imagem.
<img src=foto.jpg width=640 height=480>
Este artifcio utilizado para adequar o tamanho de uma figura ao espao disponvel ou desejado, porm, no altera o tamanho real do arquivo que contm a imagem, fato que mantm o tempo de transmisso do servidor para o cliente. Por outro lado, ajustar esses dois atributos contribui com o tempo de composio da homepage por dois aspectos: primeiro, porque o navegador formata o texto antes de carregar as informaes da imagem e segundo, com essa informao disponvel, o navegador consegue mostrar a imagem mais rapidamente. Atributos para manipular as bordas O atributo border opcional, tendo o valor 1 (um) como padro, desenha uma borda ao redor da imagem mostrada. Se a borda no for desejada, deve-se atribuir-lhe 0 (zero).
<img src=foto.jpg border=0>
Isso particularmente til quando uma figura tambm um link para navegar para outra pgina.
<a href=outra_pagina.html><img src=foto.jpg border=0></a>
Os atributos espao horizontal (hspace) e espao vertical (vspace) definem a distncia da imagem at o prximo objeto, seja ele texto ou imagem.
<img src=foto.jpg hspace=10 vspace=5>
Ttulo da imagem O ttulo mostrado quando o cursor do mouse passa ou para sobre a imagem por um determinado tempo.
<img src=foto.jpg alt=minha foto>
30
Texto alternativo O texto alternativo mostrado quando o mouse passa sobre a imagem e quando a imagem, por algum motivo, como um erro, no pode ser mostrada.
<img src=foto.jpg alt=minha foto>
Igualmente a um formulrio impresso, o formulrio eletrnico precisa de campos para que os dados sejam escritos. A partir do momento em que um formulrio foi preenchido, a prxima
Fonte: SHUTTERSTOCK.com
31
ao entreg-lo para os receptores que, somente a, faro a conferncia dos dados, avaliao, armazenamento ou outra ao. De forma semelhante, preencher os campos de um formulrio eletrnico no o faz funcionar, necessrio envi-lo a um script que, ao receber os dados do formulrio, ir process-los. Pode existir mais de um formulrio dentro de um nico documento, neste caso, a informao de cada um enviada exclusivamente. A delimitao de um formulrio Um formulrio eletrnico delimitado pelos marcadores (ou tags) <form>, que representam o incio dele e </form>, representando o final. Dentro dessa delimitao, deve estar uma sequncia de campos de entrada e de controle do formulrio, alm disso, pode conter elementos de formatao HTML do documento. Os atributos de um formulrio Dentro do marcador <form> so escritos ainda itens que definem a forma como um formulrio vai trabalhar. So eles: o nome do script que receber os dados quando o formulrio for enviado, o mtodo de envio desses dados e sua formatao. O atributo action especifica o endereo do script, incluindo o URL do servidor, para o qual sero enviados os dados do formulrio. Exemplo:
<form action=http://www.cesumar.edu/ead/cadastro_form.htm>
O atributo method seleciona um mtodo entre os dois existentes para empacotar os dados enviados. Os mtodos de transferncia do protocolo HTTP so: GET e POST, e so debatidos neste item e no item Variveis externas ao PHP ao longo deste livro. O mtodo GET transforma os dados gerados pelo formulrio em uma string contendo os pares
32
nome da varivel e o valor da varivel e concatena-a ao final do endereo especificado no atributo action, tornando, inclusive, os dados visveis para o cliente. Exemplo:
http://www.cesumar.br/ead/cadastro_script.php?nome=Carlos&cidade=Maring%E1
O ponto de interrogao separa o endereo da string de dados e o e comercial separa as variveis enviadas. J o mtodo POST transmite todas as informaes de entrada do FORM para o script em um bloco de dados endereado ao URL de forma invisvel para o usurio. Exemplo:
<form action=http://www.cesumar.edu/ead/cadastro_form.htm method=post>
O ltimo atributo do formulrio o enctype e opcional. Ele define o tipo de codificao dos dados a serem enviados ao servidor. Este atributo pode receber trs valores: multipart/formdata ou application/x-www-form-urlencoded ou text/plain. Aprenda os detalhes sobre isto no item Cuidados ao transmitir variveis pela Internet. A recepo dos dados por um script Como foi ensinado anteriormente, os navegadores transitam essas informaes com base em dois mtodos: GET e POST. Com a utilizao do mtodo GET, o script receber as variveis com seus respectivos valores inseridos no array predefinido $_GET[], cujos ndices so os nomes das variveis passadas. Exemplo:
$variavel1 = $_GET[nome]; $variavel2 = $_GET[cidade];
33
Quando os dados so enviados para um script PHP, utilizando o mtodo POST, todas as variveis do formulrio so automaticamente disponibilizadas para o script, guardadas no array $_POST[], cujos ndices so os nomes das variveis. Exemplo:
$variavel1 = $_POST[nome]; $variavel2 = $_POST[cidade];
Os campos dentro dos delimitadores de formulrios <form></form> Um formulrio eletrnico pode conter diversos tipos de campos de entrada, entre eles: os campos que aceitam que o usurio digite textos com uma ou mais linhas, menus de opes, itens de escolhas mltiplas ou exclusivas e botes. Este item descreve cada um destes tipos de campos de entrada de dados, comeando pelo mais genrico deles, o INPUT. <INPUT> Indica uma entrada de dados identificada pelo par nome (name) e valor (value) e pode ter os seguintes atributos: tipo (type), tamanho (size) e espao mximo para a digitao (maxlength). NAME o atributo que nomeia a varivel associada ao campo INPUT. VALUE o valor atribudo varivel nomeada por NAME. possvel definir um valor inicial atribuindo uma string neste campo. TYPE seleciona um tipo de campo de entrada, que pode ser: text, password, checkbox, radio, file, hidden, button, submit, image ou reset. Todos sero descritos em seguida. type=text cria uma entrada de texto a ser digitado pelo usurio, configurada pelos atributos.
34
Exemplo:
<form><input type=text size=50 maxlength=30 name=nome value=padro></form>
SIZE o tamanho com o qual o campo de entrada ser apresentado na tela do computador. MAXLENGTH a quantidade mxima de caracteres que o usurio pode digitar naquele campo. comum em formulrios de atualizao cadastral atribuir uma varivel PHP ao campo value, como no exemplo abaixo:
<input type=text size=50 maxlength=30 name=nome value=<? echo $nome ?>>
CUIDADO: utilize sempre apstrofes e no aspas, pois elas transformaro o contedo em um texto simples, e no um comando PHP.
Alguns programadores costumam omitir as aspas ou as apstrofes, visto que a linguagem HTML no as exige, porm um novo erro ocorrer: a varivel $nome ser impressa somente at a ocorrncia do primeiro espao em branco. type=password cria uma entrada de senhas, cujos caracteres digitados no so mostrados na tela do computador, mas sim substitudos por *, como no exemplo abaixo. Exemplo:
<form><input type=password size=5></form>
35
type=checkbox gera botes para mltipla escolha. Cada alternativa gera um valor diferente a ser manipulado pelo script. Exemplo:
<form> <input type=checkbox name=opcao1>Texto1 <input type=checkbox name=opcao2>Texto2 <input type=checkbox name=opcao3>Texto3 </form>
A diretiva CHECKED estabelece se uma alternativa deve iniciar com o item marcado. <input type=checkbox name=opcao1 checked>Texto1
type=radio produz um menu de escolha semelhante, porm, admissvel escolher uma nica alternativa. Para atingir esse objetivo, essencial criar um nome para o menu e repeti-lo em todas as alternativas. Exemplo:
<form> <input type=radio name=opcao>Texto1 <input type=radio name=opcao>Texto2 <input type=radio name=opcao>Texto3 </form>
A diretiva CHECKED estabelece se uma alternativa deve iniciar com o item marcado.
<input type=checkbox name=opcao checked>Texto3
36
type=file - este campo de entrada aceita o nome de um arquivo para executar um upload, que significa fazer uma cpia desse arquivo no servidor. Automaticamente aparece um boto para abrir uma janela de dilogo para procurar o arquivo desejado. Dependendo do sistema, poder aparecer o texto Browse... ou Procurar... no boto. Cada navegador pode colocar o texto que achar interessante. Exemplo:
<input type=file>
Um arquivo um tipo muito especial de dado, portanto, ser tratado de forma especial pelo script PHP que o receber. Para aprender sobre isto, estude o item Sobre uploads de arquivos.
type=hidden - um campo do tipo hidden no mostrado na tela do computador, porm, cria uma varivel com o nome especificado em NAME e associa-lhe o valor especificado no atributo VALUE. Esse par ser integrado ao pacote enviado para o script.
<input type=hidden name =cidade value=Maring>
type=button - os autores podem criar trs tipos de boto: submit, reset e pushbutton. Este ltimo no tem um comportamento padro como os anteriores. Esse tipo de boto utilizado para gerar eventos e a partir de um dos possveis, disparar uma funo, como escrever em Javascript ou chamar um novo script qualquer. Exemplo:
<input type=button value=Muda Cor>
37
type=submit cria um boto com o padro do sistema que, ao ser clicado, provoca o envio dos dados do formulrio para o script especificado no atributo ACTION de FORM. Nesse boto, o atributo VALUE significa o texto que vai denomin-lo. Exemplo:
<input type=submit value=Enviar>
type=image cria um boto do tipo submit fora do padro do sistema. Esse campo utiliza uma imagem especificada no atributo SRC para desenhar o boto, mas o efeito o mesmo de type=submit. Exemplo:
<input type=image src=botao.jpg alt=enviar>
type=reset cria um boto com o padro do sistema, que ao ser clicado limpa todos os campos j digitados. Exemplo:
<input type=reset value=Limpar>
<SELECT>
38
Indica uma entrada de dados cujo resultado uma lista de alternativas definidas por <OPTION>. Essa lista, por padro, de escolha exclusiva, porm, com a utilizao do modificador MULTIPLE, ela se torna de mltipla escolha. Alm disso, pode-se escolher alternativas para que sejam apresentadas pr-selecionadas por meio do modificador SELECTED. Exemplo:
<select name=avaliacao> <option value=vazio> </option> <option value=avaliacao1>Avaliao 1</option> <option value=avaliacao2>Avaliao 2</option> <option value=avaliacao3>Avaliao 3</option> <option value=exame>exame</option> </select>
Para selecionar mltiplas opes, deve-se manter a tecla Ctrl pressionada enquanto clica com o mouse.
Em alguns casos, seria melhor dividir o menu em submenus ou grupos. Para atingir esse resultado, deve-se utilizar a diretiva OPTGROUP que define um grupo de opes dentro do menu principal. Exemplo:
<select name=avaliacao> <option value=vazio> </option> <optgroup label=Primeira Avaliao>
39
Prova
</option>
Trabalho </option>
<optgroup label=Segunda Avaliao> <option value=prova> <option value=trabalho> </optgroup> </select> Prova </option> Trabalho </option>
<TEXTAREA> Abre uma rea de digitao de textos com vrias linhas. Este campo aceita, alm da definio de um nome, a designao de uma largura em caracteres e de uma altura em linhas. O texto entre as marcaes torna-se padro para o usurio, que pode apag-lo se desejar.
<textarea name=comentario cols=40 rows=5>Deixe seu Comentrio</textarea>
Para finalizar esta unidade, vamos debater um pouco sobre o tipo file do campo input. Para
40
isto, vamos precisar antecipar alguns conceitos, por isso talvez voc necessite voltar aqui quando estiver estudando a Unidade V.
A linguagem PHP oferece uma funo move_uploaded_file() para efetuar em conjunto com um formulrio HTML a transferncia de arquivos do cliente para o servidor. Como explicado no item anterior, quando se agrega um arquivo de qualquer tipo (texto,
Fonte: SHUTTERSTOCK.com
41
imagem ou outro), os dados so de tipos variados e o formulrio deve ser preparado para transferncias multipropsito (Multipurpose Internet Mail Extensions), que permitem o envio de formatos texto e no texto conjuntamente. Exemplo: postagem de uma foto e a descrio dela, como se faz em um fotolog.
<form action method name = ./fotolog.php = post = form
enctype = multipart/form-data> <input type = file name=foto> <textarea cols=50 rows=5 name=descricao></textarea> <input type = submit value=Enviar> </form>
O envio (submit) de um formulrio contendo tipos de dados mistos provoca aes paralelas: A criao do array $_POST[] que conter os dados no formato texto, neste exemplo, $_POST[descricao]. A criao do array $_FILES[] que conter os dados do arquivo transferido, contendo o nome do arquivo, o tipo (text/plain, image/jpeg ou outro), o nome temporrio, o cdigo de erro (0 indica que no houve erro) e o tamanho do arquivo transferido para a pasta temporria. Os dados transferidos podem ser vistos utilizando a funo print_r($_FILES) que retorna os dados contidos no array completo.
Array ( [foto] => Array ( [name] => nome_do_seu_arquivo [type] => image/jpeg [tmp_name] => /tmp/phpweiqc3
42
[error] => 0 )
A efetiva transferncia dos dados e dos arquivos. No caso especfico da transferncia de um arquivo, ela ser feita automaticamente do cliente para uma pasta temporria do servidor indicada pelo ndice [tmp_name] do array $_FILES. A movimentao interna no servidor, da pasta temporria para a pasta escolhida pelo programador, ser feita pela funo move_uploaded_file() que espera receber dois parmetros: o nome temporrio constante do array $_FILES e o nome completo do destino, formado pelo nome da pasta e o nome do arquivo.
<? $fonte = $_FILES[foto][tmp_name]; : $fonte <br>; $destino = ./upload/ . $_FILES[foto][name]; echo fonte echo destino : $destino <br>; if(!move_uploaded_file($fonte , $destino)) { echo No foi possvel enviar o arquivo!; } else { echo Arquivo enviado com sucesso!<br>; } ?>
Este link te levar para uma lista de 11 videoaulas sobre HTML5. <http://www.youtube.com/playlist?list=PLB5D86AC78EF53E8F>.
43
eStudO dIRIGIdO
1. qual a diferena entre os quatro cabealhos possveis? O primeiro deles delimitado pelas tags <head></head> e o texto que fica entre elas aparecer na barra localizada no topo do navegador. O segundo o cabealho dos textos que aparecem na tela do navegador e so delimitados pelas tags <h1></h1> at <h6></h6>, hierarquicamente. nas tabelas tambm possvel criar linhas de topo encabeando elas, para isto, utilizamos as tags <th></th> delimitando os textos que aparecero nas clulas superiores. Por fim, existem os cabealhos do protocolo HttP que no foram estudados aqui, mas sero oportunamente ainda neste curso. 2. Por que um <input> do tipo file to especial e diferente dos outros? O tipo file serve para enviar um arquivo existente, do computador cliente para o computador servidor. Quando isto acontece, criado um array especfico chamado FILE[], ele conter a descrio de cada arquivo enviado. O script PHP deve utilizar funes especficas para receb-los, diferentemente das variveis que se concentram no array GEt[] ou POSt[].
SICA, Carlos. PHP Orientado a Objetos. Rio de Janeiro: Editora Cincia Moderna, 2006. ISBN: 8573935530. SICA, Carlos. PHP Com tudo. Rio de Janeiro: Editora Cincia Moderna, 2011. ISBN: 9788539900022.
44
O site da W3Schools oferece um conjunto de tutoriais, em muitos casos, voc poder at mesmo testar o cdigo-fonte que est aprendendo. um ambiente de autoaprendizagem que poder ajudar muito no seu curso. Nesta unidade, utilize o tutorial sobre HTML. <http://www.w3schools.com/html/>. Vou te indicar este site que traz um conjunto de tutoriais. Neste caso, um tutorial sobre HTML, adequado para reforar esta unidade. <http://pt-br.html.net/tutorials/html/>.
COnSIdeRAeS FInAIS
No decorrer desta unidade, estudamos sobre a importncia de uma linguagem que possa apresentar os dados de diversos tipos na tela do navegador. HTML a linguagem nativa de todos os navegadores da Internet. Aprendemos como construir uma pgina em HTML e suas particularidades, como: corpo, links, tabelas, imagens e arquivos. Trabalhar com PHP implica obrigatoriamente em trabalhar com HTML. Atualmente, esta linguagem encontra-se na verso 5, com muitas novidades no ensinadas aqui, por isso tente se inteirar do assunto lendo os links e livros recomendados. quanto mais voc aprender sobre HTML, melhor programador PHP voc se tornar. Nesta unidade, estudamos um resumo com as principais tags que comandam a linguagem de formatao HTML, e de agora em diante vamos estudar a linguagem de programao que melhor se comunica com elas, possibilitando a criao de poderosos programas que rodam exclusivamente na Internet. Vamos comear bem devagar, mesclando as tags HTML com os comandos PHP. At que no final do livro voc possa desenvolver bons programas com o casamento destas duas linguagens.
PROGRAMAO I (PHP) | Educao a Distncia
45
ATIVIDADE DE AUTOESTUDO
1. Crie um formulrio completo para recolher os dados que compem a ficha de um cliente, incluindo sua foto. Utilize tabela para formatar a interface visualmente.
46
UNIDADE II
A LINGUAGEM PHP
Professor Me. Carlos Sica Objetivos de Aprendizagem Aprender a construo da linguagem PHP. Entender a relao de PHP com HTML. Ser capaz de desenvolver um pequeno programa para a Internet. Plano de Estudo A seguir, apresentam-se os tpicos que voc estudar nesta unidade: O que so dados e quais os tipos de dados suportados pela linguagem O que so Variveis, como compor seus nomes e como utiliz-las O que so Constantes e como elas se diferenciam das Variveis Quais so os Operadores e como so compostas as Operaes
INTRODUO
A PHP foi concebida para exclusivamente desenvolver sistemas para a Internet e tem uma forte ligao com a linguagem de apresentao chamada HTML. Por isto, para apresentar um pouco melhor a linguagem PHP, bom fazer uma pequena comparao com a conhecida HTML. A primeira diferena que a linguagem HTML no de programao, serve apenas para apresentar no navegador, de forma maquiada, as pginas criadas pelas diversas linguagens. com a linguagem HTML que so formatados os textos, construdas as tabelas, apresentadas as imagens e tudo mais que se refere ao visual. Mas para o nosso interesse, a principal diferena que o cdigo HTML interpretado pelo navegador do usurio (cliente) e o cdigo PHP interpretado pelo servidor (provedor) e, ao final da interpretao, o servidor PHP gera uma pgina como se fosse originalmente escrita na linguagem HTML e a envia para o navegador.
O usurio final (cliente) nunca enxerga o cdigo-fonte PHP, o que ele vai ver apenas o resultado gerado no navegador. Mas voc que o programador, criar o cdigo PHP no computador servidor.
Fonte: SHUTTERSTOCK.com
49
Este conceito de cliente servidor muito importante para o aprendizado de PHP, ento eu recomento que voc o domine antes de continuar. Veja no final desta unidade, no item Saiba mais sobre o assunto, uma sugesto de leitura complementar. As pessoas s conseguem acessar a Internet porque ela uma rede de computadores constituda por clientes e servidores. Do seu computador, quando voc v uma pgina, voc o cliente e est enxergando o que est no servidor que hospeda aquela pgina, mas de forma maquiada.
Para programar em PHP, voc precisa ter acesso a um servidor PHP fornecido pelo seu provedor ou criar um servidor PHP no seu prprio computador. Um programa PHP tambm conhecido por script, que significa, ao p da letra, escrita, mas significa o programa em si, ou parte do programa que roda naquele momento. Voc vai encontrar o termo script neste livro e em outros que ler, mas lembre-se que apenas um sinnimo tcnico de um programa de computador.
50
Fonte: SHUTTERSTOCK.com
Nossos exemplos seguiro este modelo abreviado. Para imprimir uma frase no vdeo, em HTML, basta escrev-la no corpo do arquivo com a terminao .htm ou .html e pronto. O cdigo-fonte em HTML fica assim:
<html> <body> Esta frase aparecer no vdeo. </body> </html>
51
Porm, no cdigo PHP, necessrio delimitar com as tags especficas e utilizar funes especficas e, alm disso, o arquivo dever ter a extenso .php em vez de .htm ou .html. Por mais simples que sejam, nossos exemplos imprimem os resultados na tela do navegador, portanto, precisamos conhecer, neste momento, um comando PHP chamado echo que serve para imprimir alguma coisa na tela do navegador. Apesar de no ser obrigatrio, quando utilizarmos o comando echo vamos sempre utilizar o contedo a ser mostrado na tela, entre parnteses por uma questo de organizao e esttica. Adiantando outro detalhe muito importante, todas as linhas de comando PHP precisam ser terminadas por ponto e vrgula.
<? echo(<html>); echo(<body>); echo(Esta frase aparecer no vdeo.); echo(</body>); echo(</html>); ?>
possvel tambm mesclar os dois cdigos (HTML e PHP), mas da mesma forma que o exemplo anterior (100% PHP), o arquivo misto dever ter extenso .php.
<html> <body> <? echo(Esta frase aparecer no vdeo.); ?> </body> </html>
52
Comentrios Comentrios so linhas no cdigo-fonte que no tm efeito de programao, servem apenas para o programador documentar o programa. H dois tipos de comentrios no cdigo PHP: Os comentrios de uma linha, indicados preferencialmente por duas barras //, e opcionalmente pelo sinal #. Comentrios de mais de uma linha delimitados pelos caracteres /* para o incio do bloco e */ para o final do bloco comentado. Exemplo 1:
// Estas linhas so comentrios e no tm efeito de programao, // nem precisam ser terminadas por ponto e vrgula.
Exemplo 2:
/* Este bloco um comentrio, podem ser colocadas aqui quantas linhas forem necessrias, e tambm no precisam ser terminadas por ponto e vrgula. */
Separador de instrues A exemplo de linguagens como C/C++, Pascal, Java, Perl e outras, PHP exige que cada linha de comando seja terminada com o ponto e vrgula. Em comentrios e na ltima instruo do bloco delimitado pelos sinais acima descritos, no necessrio o uso do ponto e vrgula.
<? echo(primeiro comando em PHP); echo(segundo comando em PHP); // ---------------------------echo(o ltimo comando em PHP no exige ponto e vrgula) ?>
53
A partir de agora, durante o decorrer deste livro, no ser necessrio utilizar os delimitadores de PHP <? ?> nos exemplos, pois o leitor j sabe que sempre que for programar em PHP, precisa usar estes delimitadores no seu cdigo.
54
Exemplo: Array de bolinhos. Mesmo com essa interpretao automtica, o programador pode converter explicitamente os valores de um tipo em outro desejado, utilizando o typecasting ou a funo settype(), ambos sero debatidos no item Transformao de Tipos (cast). A composio dos nomes das variveis segue as regras apresentadas no item Nomes de variveis. Mas como vamos utilizar algumas variveis nos exemplos que seguem, precisamos adiantar que toda varivel no PHP deve ter seu nome inicializado pelo caractere $ e, aps ele, vem uma sequncia de caracteres que deve ser iniciada por uma letra ou pelo caractere _. A seguir so explicados os tipos de dados suportados pela linguagem. Nmeros inteiros (integer ou long) Uma varivel pode conter um valor inteiro curto ou longo. A diferena entre eles o nmero de bytes utilizados para armazen-los na memria, porm, isso tambm transparente para o programador, pois quem define o interpretador, de acordo com as necessidades do momento. Exemplos:
$valor = 456; $valor = -456; $valor = 0710; por 0 octal) // inteiro positivo na base decimal // inteiro negativo na base decimal // inteiro na base octal (todo nmero inicializado
$valor = 0x1C8; // inteiro na base hexa (todo nmero inicializado por 0x hexa)
Fonte:SHUTTERSTOCK.com
55
Nmeros Reais (float ou double) Uma varivel pode conter um valor real (ponto flutuante) curto ou duplo. A diferena entre eles o nmero de bytes utilizados para armazen-los na memria, porm, da mesma forma que o inteiro, isso tambm transparente para o programador.
$valor = 1.456; $valor = 45e1; // Real positivo igual a 1,456 // Real positivo em notao cientfica (450) $valor = -1.456; // Real negativo igual a -1,456
ou
$nome = Carlos Benedito; $sobrenome = Sica de Toledo;
Para imprimir um texto to simples como atribuir ele para uma varivel. Exemplo:
echo (CESUMAR);
ou
echo (CESUMAR);
56
Para imprimir variveis do tipo string tambm no traz nenhum segredo. Exemplo:
echo($nome);
Porm, quando vamos juntar tudo isto, necessrio tomar muito cuidado, pois a utilizao das aspas e das apstrofes neste ato pode confundir o programador. Envolver o nome da varivel pelas aspas no modifica o resultado, o valor da varivel ser impresso normalmente. Exemplos:
echo(Nome: $nome $sobrenome);
O nome completo (nome e sobrenome) contido nas duas variveis ser impresso, precedido pela palavra Nome: e separado por um espao em branco explicitado no comando entre as duas variveis. O resultado final ser este: Nome: Carlos Sica De forma diferente, envolver o nome da varivel pelas apstrofes implicar em imprimir textualmente o nome dela, e no o valor. Exemplo:
echo(O contedo da varivel $nome : echo($nome); );
E o resultado ser: O contedo da varivel $nome : Carlos Benedito. Algumas vezes ser necessrio imprimir a prpria aspas e apstrofe. Quando for o caso, utilize o caractere de controle conhecido como contrabarra, tambm conhecido como barra invertida
57
E o resultado ser: O contedo da varivel $nome : Carlos Benedito. A seguir sero apresentados outros caracteres de controle. ALGUMAS FUNES DE STRING strlen() Retorna o tamanho de uma $str = abcdef; string (os espaos so echo strlen($str);
Resultado: 6
dentro da string e substitui $str=str_replace(\ Encontra a posio de uma $str = abcdef; substring dentro da string. echo strpos($str,f); A primeira posio 0 (zero). Resultado:
5
Fonte: o autor
Caracteres de controle Os caracteres de controle so predefinidos pela linguagem e utilizados especificamente para realizar uma ao. Quando voc precisar imprimir um desses caracteres, sempre preceda-o pela contrabarra.
58
Sintaxe \\ \$ \ \
Resultado Imprime a contrabarra Imprime o smbolo Imprime uma apstrofe Imprime uma aspa
Impresso \ $
Ao sem a contrabarra Caractere de controle Preceder o nome de uma varivel Envolver uma string Envolver uma string
Fonte: o autor
Exemplo:
$salrio = 15.230,23; echo(O salrio de echo ($salrio); R\$ );
Resultando na frase: O salrio de R$ 15.230,23. Quebra de linha Como os resultados de um script PHP sempre sero mostrados no navegador, necessrio utilizar a tag <br> para quebrar uma linha de texto no navegador (simulando um Enter). Sempre que quisermos iniciar a impresso em uma nova linha, colocamos esta tag dentro da string, ao final da linha a ser impressa. Exemplo:
echo(Linha1<br>Linha2<br>);
59
Existem trs outros caracteres de controle que no podem ser impressos e nem servem para comandar os Navegadores de Internet, porm podem constar em arquivos do tipo texto que eventualmente sero manipulados pelos seus programas escritos em PHP.
Sintaxe \n \r \t Fonte: o autor Resultado Nova linha Retorno de carro Tabulao horizontal
Quando ns formos estudar arquivos na Unidade IV, trataremos tambm estas constantes que representam uma quebra de linha. A constante \r e a constante \n significam, respectivamente, retorno do cursor para o incio da linha e mudana do cursor para uma nova linha.
Quando um array criado sem especificar os ndices, eles so criados automaticamente a partir do zero.
60
Valor ndice
Casa 0
Facul 1
Prdio 2
Cama 3
Vaso 4
Bike 5
Telha 7
Carro 8
Moto 9
Para acessar um valor, por exemplo, para imprimir, utilize o ndice entre colchetes. Exemplo:
echo $coisas[3];
Este comando imprimir: Cama Como a checagem dos tipos no PHP dinmica, tanto os valores como os ndices podem ser diferentes. Exemplo:
$cor[1] = vermelho; $cor[2] = verde; $cor[3] = azul; $cor[teste] = 1;
Valor ndice
vermelho 1
verde 2
azul 3
1 teste
Como voc j deve ter percebido, um vetor pode ser criado de vrias maneiras: Com a utilizao da funo array(), declarando somente os valores e os ndices, sero criados automaticamente:
$vetor = array(3, 5, 9, 11);
Nesta forma, o primeiro elemento antes do smbolo de associao (=>) o ndice do vetor e, o segundo, o valor atribudo ao elemento.
61
O arranjo pode ainda ser criado com a simples atribuio de cada valor ao ndice especfico. Isto pode ser feito manualmente ou utilizando uma estrutura de repetio for.
$vetor[0] = 3; $vetor[1] = 5; $vetor[2] = 9; $vetor[3] = 11;
e
var_dump($cor);
Para que o usurio receba as informaes formatadas, melhor utilizar a dupla de tags de formatao HML <pre></pre>. Exemplo:
echo(<pre>); print_r($cor); echo(</pre>);
ALGUMAS FUNES DE ORDENAO ARRAYS A biblioteca PHP oferece um conjunto de funes que servem para ordenar o contedo do array. Vamos conhecer cada uma delas na tabela abaixo: sort($array) Ordena o array em ordem crescente
echo <pre>; $array = (Maria, Carlos, Wilson); print_r($array); sort($array); print_r($array); echo </pre>;
62
rsort($array)
echo <pre>; $array = (Maria, Carlos, Wilson); print_r($array); asort($array); print_r($array); echo </pre>; echo <pre>; $array = (idade=>23, peso=>75); print_r($array); asort($array); print_r($array); echo </pre>;
asort($array)
arsort($array)
ksort($array)
echo <pre>; $array = (idade=>23, peso=>75); print_r($array); asort($array); print_r($array); echo </pre>;
Fonte: o autor
63
Listas (lists) As listas so utilizadas no PHP para realizar atribuies mltiplas. Utilizando as listas, possvel atribuir os valores que esto em um array para um conjunto de variveis. Esta uma forma de separar um array em vrias variveis, tornando os dados independentes, porm, importante destacar que s so atribudos s variveis da lista os elementos do array que possuem ndices inteiros e no negativos. Exemplo:
list($a, $b, $c) = array(a, b, c);
O comando acima atribui valores s trs variveis comuns ($a, $b, $c) simultaneamente, com base nos valores contidos no array. Outra forma de criar uma lista de variveis a partir de uma array existente mostrada no exemplo a seguir. Exemplo:
$arr = array(1=>um,3=>trs,a=>letraA,2=>dois); list($a,$b,$c,$d) = $arr;
Aps a execuo do cdigo acima, os seguintes valores so atribudos: $a => null $b => um $c => dois $d => trs
64
Anlise: Observe que no foi atribudo valor varivel $a, pois no array no existe elemento com ndice 0 (zero). Outro detalhe importante que o valor trs foi atribudo varivel $d e no a $b, pois seu ndice 3, justamente o qual vai coincidir com a posio da varivel $d na lista. Por fim, possvel notar que o valor letraA no foi atribudo a nenhum elemento da lista, pois seu ndice no inteiro e a lista trabalha somente com ndices inteiros. Os ndices da lista servem apenas como referncia para o interpretador PHP realizar as atribuies, no podendo ser acessados de maneira nenhuma pelo programador. De maneira diferente do array, uma lista no pode ser atribuda a uma varivel, servindo apenas para fazer mltiplas atribuies com o apoio de um array.
Transformao de tipos (cast) A transformao de tipos no PHP pode ser feita de trs maneiras: automaticamente (cast automtico ou coero); explicitamente pelo usurio, utilizando o typecast; ou utilizando a funo settype(). No primeiro caso, quando ocorrem determinadas operaes que envolvem dois valores de tipos diferentes, o PHP converte o contedo de um deles automaticamente para adequar o resultado sem, porm, alterar o valor contido no operando. O tipo no qual os valores dos operandos sero convertidos tem a ordem de precedncia mostrada na tabela a seguir.
65
Ordem 1 2
Fonte: o autor
Uma string convertida em um nmero real ou inteiro quando comeada por um nmero de acordo com a anlise realizada pelo interpretador e, no caso de comear por uma letra, ser convertida em zero. O interpretador descobre e aceita sinais precedendo nmeros, pontos que representam as casas decimais e a letra e ou E como exponencial.
$valor = 3e2; // $valor recebe 300, que 3 x 102 echo($valor); // imprime 300
No segundo caso, a transformao explcita dos tipos, deve explicitar-se no tipo de dado de forma semelhante a da linguagem C, escrevendo o novo tipo entre parnteses antes do valor a ser convertido.
$valor_real = 3.2; echo($valor); echo($valor_int); // cria uma varivel real // imprime 3.2 // imprime 3
Abaixo a tabela com as palavras-chaves aceitas para compor o cast. Cast int ou integer real, double ou float string array
Fonte: o autor
Tipo Inteiro Real com ponto flutuante Cadeia de caracteres Vetor indexado
Finalmente, utilizando a funo settype(), que converte uma varivel no tipo especificado, que pode ser integer, double, string, array ou object. Exemplo:
$valor = 15; // $valor integer settype($valor,double); // muda $valor para double PROGRAMAO I (PHP) | Educao a Distncia
66
Verificao do tipo de uma varivel Como j foi analisada anteriormente, a tipagem utilizada pelo PHP dinmica, portanto, nem sempre o programador sabe qual o tipo de uma varivel em determinado instante. Por isso existem duas maneiras de verificar o tipo delas: Utilizando a funo gettype(), que retorna o tipo da varivel testada indicada por uma das seguintes strings: integer, double, string, array, object e unknown type. Exemplo:
echo(gettype($var));
E por meio das funes que testam o tipo da varivel, so elas: is_int(), is_integer(), is_real(), is_long(), is_float(), is_string(), is_array() e is_object(). Todas estas funes retornam verdadeiro se a varivel for do tipo perguntado e falso em caso contrrio. Exemplo:
if(is_float($var)){ } else{ }
Esta estrutura de comparao (tambm conhecida como seleo) explicada na unidade especfica.
67
VARIVEIS
As variveis so os espaos da memria utilizados para guardar valores que podem ser modificados pelo programa. Cada posio da memria utilizada batizada com o nome da varivel. A figura abaixo exemplifica a relao de uma varivel com a memria. Nome da varivel $valor
Fonte: o autor
Contedo da memria 45
A criao de uma varivel corresponde ao do sistema ao reservar um determinado espao na memria do tamanho adequado para guardar o dado desejado. O tamanho do espao que cada varivel vai utilizar na memria depende do seu tipo, porm, como a tipagem no PHP dinmica, as variveis no precisam ser declaradas antecipadamente. Ela criada no momento em que feita a primeira atribuio e o tipo dessa varivel ser definido automaticamente de acordo com o valor atribudo. Tecnicamente, esse conjunto de aes chamado de alocao de memria. Nomes de variveis Toda varivel no PHP deve ter seu nome inicializado pelo caractere $ e aps ele, vem uma sequncia de caracteres que deve ser iniciada por uma letra ou pelo caractere _. Exemplos:
$valor_1 = 36; $valor_2 = 45; $soma = $valor_1 + $valor_2;
Como o PHP case sensitive, uma letra maiscula diferente de uma minscula, tradicionalmente, os programadores utilizam letras minsculas para compor o nome das variveis e maisculas para compor o nome das constantes, fato produtivo, pois diferencia as
68
variveis criadas pelo programador das inerentes linguagem, que possui muitas variveis predefinidas cujos nomes so compostos por letras maisculas. Escopo das variveis Podemos notar que o conceito de funes aparece logo no incio do aprendizado da linguagem. Uma funo um trecho ou mdulo de programa delimitado, que executa uma ao especfica. Pode estar pronta, na biblioteca do PHP, mas tambm pode ser escrita pelo programador, este segundo tipo ser explicado no item Funes definidas pelo usurio . O escopo de uma varivel o tempo de vida dela, o que est diretamente relacionado com o mdulo do programa que ela foi criada, no qual ela visvel ou acessvel, portanto, o escopo varia de acordo com o local onde ela foi declarada. Conforme o resumo mostrado na tabela abaixo, as variveis podem ser declaradas em trs lugares bsicos que definem o seu escopo: no programa principal desta forma se tornam acessveis por todo o programa e pelas funes, por este fato so chamadas de globais; dentro das funes o que as torna visveis (ou acessveis) somente para a funo que as criou, assim que a funo for encerrada este tipo de varivel morre; na lista de parmetros uma cpia da varivel (valor) ou o seu endereo (referncia) enviado para a funo chamada. Local da declarao Dentro das funes Fora de todas as funes Na lista de parmetros das funes
Fonte: o autor
69
Variveis locais As variveis locais so declaradas dentro de uma funo e s podem ser referenciadas por comandos que esto dentro do bloco no qual esto declaradas. Uma varivel local criada no momento da sua declarao e destruda na sada da funo.
function funcao1(){ $x = 10; } function funcao2(){ $x = -199; }
Neste exemplo, pode parecer que a varivel inteira $x declarada erroneamente, duas vezes, uma vez em funcao1() e outra em funcao2(), porm, o $x em funcao1() no tem nenhuma relao ou correspondncia com o $x em funcao2() porque esto em blocos de cdigos diferentes. Cada funo tem seu prprio escopo. Variveis globais Ao contrrio das variveis locais, as variveis globais so declaradas fora das funes e reconhecidas pelo programa inteiro, assim, podem ser utilizadas em qualquer bloco do cdigo do programa desde que explicitada pela diretiva global. Exemplo:
$conta=340; // esta uma varivel global function teste(){ $conta = 100; echo(O valor de conta ,$conta); }
70
O resultado da impresso ser: O valor de conta 100, pois prevalece o valor da varivel local. Caso exista uma varivel global e uma local com o mesmo nome, a varivel com o escopo local acessada prioritariamente ali. Vejamos outro exemplo de duas variveis, uma global e outra local com o mesmo nome. O escopo de cada uma respeitado.
function teste(){ $z=5; echo(durante: $z<br>); } $z=3; echo(antes teste(); echo(depois : $z<br>); : $z<br>);
71
O modificador de escopo global Uma varivel de escopo global pode ser utilizada no interior de uma funo (escopo local), porm, necessrio explicitar esta inteno com a aplicao do modificador global, que pode conter diversas variveis, separadas por vrgulas.
function globo(){ global $valor,$res; echo(Valor inicial: ); echo ($valor); echo(, resultado final: ); echo($res); } $valor = 100; $res = 10 * $valor; globo();
Resultado: Valor inicial: 100, resultado final: 1000. Outra maneira de acessar as variveis de escopo global dentro de uma funo utilizando um array predefinido pelo PHP cujo nome $GLOBALS[]. O ndice para a varivel referida o prprio nome da varivel, sem o caractere $. O exemplo abaixo produzir o mesmo resultado do anterior.
$valor = varivel global; function globo(){ echo($GLOBALS[valor]); } globo();
72
O resultado impresso ser: varivel global. O adaptador de escopo static Uma varivel quando precedida pelo modificador static dentro de uma funo chamada de esttica, porque visvel naquele escopo local, mas inicializada apenas uma vez e seu valor no perdido quando a execuo do script deixa esse escopo.
function teste(){ static $z = 0; echo(a varivel z vale: $z); $z++; }
As variveis declaradas como estticas so mantidas vivas ao terminar a execuo da funo, preservando o valor nelas armazenados. Na prxima execuo da funo, ao encontrar novamente a declarao da varivel, precedida pelo modificador static, o ltimo valor daquela varivel ser recuperado. Portanto, uma varivel declarada com esse modificador tem o mesmo tempo de vida de uma varivel global, porm, sua visibilidade restrita ao escopo local no qual foi declarada. Para testar o exemplo acima, no se esquea de chamar a funo mais de uma vez no mesmo script.
teste(); teste(); // imprime a varivel z vale: 0 // imprime a varivel z vale: 1
Variveis variveis O PHP tem um recurso conhecido como variveis variveis, ilustrado na figura que vem logo na sequncia.
73
Este artifcio consiste em variveis cujos nomes tambm podem variar, ou seja, no somente o valor, mas o nome de uma varivel pode ser modificado. Sua aplicao feita com a utilizao do duplo cifro ($$) precedendo o nome da varivel. Nome da varivel $a $$a ou $simples
Fonte: o autor
Exemplo:
$a = simples; $$a = dupla;
Este conceito se assemelha aos ponteiros da linguagem C/C++, pois, considerando que o nome de uma varivel o apelido do seu endereo, o conceito de varivel remete ao conceito de ponteiros: ...posio nomeada da memria..., portanto, $a aponta para o contedo simples que, por sua vez, aponta para o contedo duplo. Variveis externas ao PHP Para produzir uma navegao interativa, a linguagem Web nativa, que o HTML, deve se comunicar com o PHP permitindo o envio de dados (valores) atribudos a variveis no navegador. Essas variveis podem ser criadas de duas formas: escrevendo-as literalmente no endereo Web chamado; e partindo de formulrios compostos por campos preenchidos pelo usurio. Nos dois casos, as informaes so enviadas para o script PHP por meio da chamada da pgina mediante o navegador.
74
Os mtodos de interao Os navegadores enviam os valores dessas variveis para o servidor baseando-se em dois mtodos: GET e POST. O primeiro agrega os nomes das variveis e seus respectivos valores concatenando essa lista ao final do endereo Internet (URL) buscado, tornando os nomes e valores das variveis visveis ao usurio. J o mtodo POST transmite todas as informaes de entrada do <form> para o script PHP em um bloco de dados endereado ao endereo Internet (URL), de forma que o usurio no as veja. O mtodo GET, pelo fato de passar a lista de variveis agregada ao final do URL, permite que o usurio escreva essas variveis e seus respectivos valores diretamente no navegador, como no exemplo fictcio abaixo:
www.sica.pro.br/sica/teste.php?var1=33&var2=65
O script teste.php, exemplificado abaixo, receber duas variveis (var1 e var2) com seus respectivos valores e dever captur-las pelo array predefinido $_GET[], cujos ndices so os nomes das variveis passadas:
$variavel1 = $_GET[var1]; $variavel2 = $_GET[var2]; $resultado = $variavel1 * $variavel2; echo O resultado de $variavel1 * $variavel2 $resultado;
Esta tcnica manual raramente utilizada, porque o cliente no saberia digitar tudo isto na linha de navegao. A forma usual a utilizao de formulrios de coleta de dados, que so delimitados pelas tags HTML <form></form>. Neste caso, o programador pode optar entre o mtodo GET ou POST para enviar os dados para o servidor.
75
Quando os dados so enviados para um script PHP, todas as variveis do formulrio so automaticamente disponibilizadas para o script, pelos arrays $_GET[] ou $_POST[], dependendo do mtodo previamente escolhido. A sintaxe utilizada pelo PHP para receber as variveis pelo mtodo POST semelhante a do GET.
$variavel1 = $_POST[var1]; $variavel2 = $_POST[var2];
Cuidados ao transmitir variveis pela Internet O atributo enctype em um formulrio opcional e define o tipo de codificao dos dados a serem enviados ao servidor. Este atributo pode receber trs valores: multipart/form-data ou application/x-www-form-urlencoded ou ainda text/plain. O valor padro em caso de omisso application/x-www-form-urlencoded, que atende a maioria dos casos de transmisso de dados entre script s. Assim, por padro, os contedos das variveis so passados no formato URLencode, que obtido substituindo os espaos pelo caractere + e todos os outros caracteres no alfanumricos, com exceo do sublinhado (_) pelo caractere %, seguido do cdigo ASCII em hexadecimal. Por exemplo, o texto CESUMAR - EAD em URLencode fica CESUMAR+%2D+EAD. O nmero hexadecimal 2D representa o trao no formato citado. Se o texto transmitido contiver quebras de linha, esta ser representada pelo cdigo %0D%0A, que significa retorno de carro (CR) e alimentao de linha (LF), respectivamente. O PHP possui duas funes para tratar o texto no formato URLencode, cujos prottipos so os seguintes:
string urlencode(string texto); string urldecode(string texto);
76
Essas funes servem, respectivamente, para codificar ou decodificar um texto passado como argumento, mas no caso de um envio a partir de um formulrio, a codificao automtica. Quando se transmite vrios tipos de dados a partir de um mesmo formulrio, por exemplo, no caso do upload de arquivos, obrigatrio o uso do valor multipart/form-data que indica a presena de diferentes tipos de dados. Este tipo de agregao de informaes chamado de Multipurpose Internet Mail Extensions, que permite a transferncia de dados em formatos mltiplos. Exemplo:
<form action method name = ./fotolog.php = post = form
enctype = multipart/form-data> <input type = file name=foto> <textarea cols=50 rows=5 name=descricao></textarea> <input type = submit value=Enviar> </form>
No ltimo caso, o text-plain, os espaos so convertidos para +, porm os demais caracteres no so modificados. Como os formulrios escritos em HTML em regra enviam dados para entidades como Bancos de Dados e outros, a preparao dos dados para envio pela rede tambm deve ser feita. O atributo accept-charset especifica a lista de conjuntos de caracteres que so aceitos pelo servidor durante o processamento dos dados do formulrio.
<form action method name enctype <input ... > </form> =script.php = post = form = multipart/form-data
accept-charset = ISO-8859-1>
77
A utilizao de Forms
Caro(a) aluno(a), o conhecimento de HTML para desenvolver programas para a Internet, seja em qualquer linguagem, essencial. Se voc ainda no domina HTML, estude em paralelo para que possa dar continuidade ao aprendizado de PHP.
Um campo de formulrio definido como <input type=text name=cidade>, ao ser enviado a um script PHP, far com que seja criada uma posio no array GET ou POST com o ndice cidade, portanto a varivel descrita acima deve ser acessada como $_GET[cidade] ou $_POST[cidade] dependendo do mtodo especificado no formulrio. Na prtica, deve-se utilizar o cdigo HTML abaixo para criar um formulrio e o cdigo PHP para receber e trabalhar com a varivel enviada pelo formulrio. Exemplo HTML: formulrio que coletar os dados para enviar ao script PHP.
<form action=seu_script.php method=post enctype=multipart/formdata> <input type=text name=cidade> <input type=submit value=Enviar> </form>
Exemplo PHP: script PHP que receber os dados enviados pelo formulrio.
<? $cidade = $_POST[cidade]; echo($cidade); ?>
78
Variveis de ambiente As variveis de ambiente so ajustadas no momento em que o servidor executa um script PHP solicitado. Existem dois tipos de variveis de ambiente: as com valores independentes da requisio, contendo informaes bsicas, e as que variam com cada execuo do script. As variveis $PHP_SELF e $PATH_INFO, por exemplo, contm o nome e o caminho do arquivo do prprio script. Outras contm informaes sobre o navegador do usurio, o servidor http, a verso do PHP etc. Para obter uma listagem de todas as variveis e constantes de ambiente e seus respectivos contedos, invoque a funo PHPinfo() inerente ao ambiente PHP que ela imprimir no navegador todas as variveis de ambiente. Exemplo:
<? PHPinfo(); ?>
Destruindo uma varivel explicitamente O sistema do PHP destri cada varivel sempre que necessrio, porm possvel desalocar a memria utilizada por uma varivel quando necessrio, utilizando a funo unset(), que libera a memria e retorna verdadeiro caso a operao seja bem-sucedida. Exemplo:
$a = 3; echo($a); unset($a); echo($a); // no imprime // imprime 3
79
Verificando se uma varivel possui um valor Existem dois tipos de funes que podem verificar se uma varivel foi criada ou inicializada (usualmente conhecida como ligada): a funo isset() e a funo empty(). A funo isset() retornar verdadeiro se a varivel contiver algum valor (estiver ligada, ainda que com uma string vazia ou o valor zero) e falso em caso contrrio. Exemplo: um campo de um formulrio no foi preenchido e o script recebe o campo no inicializado, ou seja, aquela posio do array estar nula.
if (!isset($_POST[cidade]) echo(O campo cidade no foi preenchido);
A funo empty() retornar verdadeiro se a varivel no contiver nenhum valor (no estiver ligada), possuir um valor 0 (zero) ou uma string vazia. Caso contrrio, retornar falso.
if (empty($_POST[cidade]) echo(O campo cidade no foi preenchido);
CONSTANTES
Por definio, uma vez associado um valor a uma constante, o mesmo no poder mais ser alterado, alm disso, uma constante s pode conter valores escalares, sendo proibidos arrays e objetos. Para definir as constantes, utiliza-se a funo define() que espera receber dois parmetros: o nome e o valor da constante aps sua execuo. Retornar verdadeiro se for bem-sucedida e falso caso contrrio. Exemplo:
define (PI, 3.1415926536); $raio = 3; // imprime 18.8495559216 $circunf = 2*PI*$raio; echo($circunf);
Em contraste com os nomes das variveis, tradicionalmente ns, programadores, utilizamos letras maisculas para compor os nomes das constantes.
80
Constantes predefinidas O ambiente do servidor PHP possui algumas constantes predefinidas, indicando, por exemplo, a verso do PHP, o Sistema Operacional do servidor, o arquivo em execuo etc. Como j foi citado, possvel enxergar todas as constantes predefinidas invocando a funo PHPinfo(), que exibe uma tabela contendo todas as variveis e constantes do sistema.
OPERADORES
Atribuio O operador = o operador bsico de atribuio, mas existem outros derivados dele, que sempre retornam o valor a ser atribudo na varivel.
$a = 21;
No caso dos operadores derivados de atribuio, a operao feita entre os dois operandos antes da atribuio, sendo atribudo o resultado da operao ao primeiro operando, especificado esquerda da atribuio. Exemplo: A operao $a = $a + 30 pode ser escrita $a += 30; Operadores de atribuio compostos so: Operador = += -= *= /= %= .=
Fonte: o autor
Ao atribuio simples atribuio com adio atribuio com subtrao atribuio com multiplicao atribuio com diviso atribuio com mdulo atribuio com concatenao
81
Aritmticos Os operadores aritmticos so aplicveis somente aos tipos numricos (integer ou float). Se forem de outro tipo, tero seus valores convertidos automaticamente ou explicitamente de acordo com as regras descritas no item Transformao de tipos (cast), antes da realizao da operao. Os operadores aritmticos so: Operador + * / %
Fonte: o autor
Ao Subtrao, tambm menos unrio Adio Multiplicao Diviso Mdulo da diviso (resto)
Existem tambm dois operadores especiais chamados unrios de incremento e decremento. Operador ++ -Fonte: o autor
Ao incremento decremento
Eles podem ser especificados de duas formas: antes ou depois da varivel. Quando utilizado antes, retorna o valor da varivel antes de increment-la ou decrement-la. Quando utilizado depois, retorna o valor da varivel j incrementado ou decrementado. Exemplo:
$a = $b = 10; echo($a - $b - $c - $d<br>); $c = $a++; $d = ++$b; incrementado echo($a - $b - $c - $d); // $a e $b recebem o valor 10 // imprime 10 - 10 - // $c recebe 10 e $a passa a ter 11 // $d recebe 11, valor de $b j // imprime 11 - 11 - 10 - 11
82
A ordem de precedncia dos operadores aritmticos como segue: Mais alta ++, -- (menos unrio) *, /, % +, -
Mais baixa
Fonte: o autor
Lgicos Tambm conhecidos como operadores bit a bit, so muito utilizados para operar nmeros inteiros representando valores booleanos, mas se aplicam a qualquer tipo de dado. Operadores lgicos so: Operador & | ^ !
Fonte: o autor
Ao e ou ou exclusivo negao
Varivel b c a
Anlise Decimal Binrio 35 0010 0011 128 1000 0000 163 1010 0011
83
Relacionais Operadores relacionais so conhecidos tambm como operadores de comparao. As comparaes so feitas sempre entre dois valores, que podem estar contidos nas variveis ou nas constantes. Uma comparao sempre resulta em um valor booleano simulado, pois qualquer valor diferente de zero considerado verdadeiro e o valor exato zero considerado falso. Os operadores lgicos relacionais implementados no PHP so: Operador == != === !== Ao Igual Diferente Idntico No idntico
($a == b)
exemplo
($a != $b)
verdadeiro se $a for igual a $b e eles forem do mesmo tipo ($a !== $b) verdadeiro se $a for diferente de $b ou eles no forem do mesmo tipo
Fonte: o autor
Observe que o smbolo da relao de diferena composto pelo sinal de igual (=) precedido pela negao (!).
84
Os operadores que estabelecem relao de quantidade ou grandeza entre dois nmeros so listados abaixo: Operador > >= < <=
Fonte: o autor
Ao Maior que Maior que ou igual Menor que Menor que ou igual
Exemplo
Os resultados destas operaes podem ser combinados utilizando os operadores lgicos relacionais E e OU listados na tabela abaixo. Operadores lgicos atuando sobre os relacionais: Operador Ao Exemplo (($a > $b) && E (($a > $b) || Ou
Fonte: o autor
&& ($c < 0)) || ($c < 0))
O primeiro exemplo significa informe se a varivel a maior que b e tambm, paralelamente, se a varivel c maior que zero. O resultado ser verdadeiro se os valores satisfazerem todas as exigncias. Se apenas um falhar o resultado ser falso. Ordem de precedncia dos operadores relacionais: Maior ! > >= < <= == != && ||
Menor
Fonte: o autor
85
Concatenao Existe apenas um operador de concatenao e ele exclusivo das operaes realizadas com strings, cujo smbolo o ponto. Operador Ao . concatenao Fonte: o autor Exemplo:
$nome = Wilson; $sobrenome = Mattos; echo($nome. .$sobrenome);
De deslocaento de bits Em aplicativos cientficos, muito comum a utilizao de operaes que deslocam os bits de um valor para a esquerda ou para a direita. O nmero de vezes que os bits vo ser deslocados deve ser especificado. Operadores de deslocamento de bits: Operador >> <<
Fonte: o autor
Exemplo:
$a = 32; $b = $a >> 2; // a = 32(decimal), 0010 0000 (binrio) // b = 8(decimal), 0000 1000 (binrio)
86
Deslocar os bits de um valor uma vez para a esquerda signifi ca multiplicar o nmero por 2 e deslocar para a direita o mesmo que dividir esse nmero por 2.
eStudO dIRIGIdO
1. A linguagem PHP trabalha com variveis tipadas? Sim, a tipagem automtica e admite os tipos: Inteiro. Real (Ponto flutuante). Caracteres (char). Cadeias (sequncias ou arranjos) de caracteres (string). Cadeias (sequncias ou arranjos) de dados (array). Objeto (somente para a programao orientada a objetos).
87
2. O que so Variveis e como so compostos seus nomes? As variveis so posies de memria do computador, onde so armazenados os dados. Em PHP, toda varivel deve ter seu nome inicializado pelo caractere $ e aps ele, vem uma sequncia de caracteres que deve ser iniciada por uma letra ou pelo caractere _ e as letras maisculas so diferenciadas das minsculas. 3. O que so Constantes e como elas se diferenciam das Variveis? Constantes, como o prprio nome diz, no podem ter seus valores alterados. Isto acontece porque elas no ocupam memria, mas fazem parte do cdigo do programa e esta, justamente, a diferena entre elas e as variveis que tm seus valores guardados na memria e podem ser alterados ao longo do programa. 4. Quais so os operadores aritmticos e qual a sua ordem de precedncia? Operador Ao Subtrao, tambm menos unrio + Adio * Multiplicao / Diviso % Mdulo da diviso (resto) Existem tambm dois operadores especiais chamados unrios de incremento e decremento Operador Ao ++ incremento -decremento A ordem de precedncia dos operadores aritmticos como segue: Mais alta ++, -- (menos unrio) *, /, % +, -
Mais baixa
88
5. Deslocar um nmero inteiro de um bit para a direita significa qual operao matemtica? E para a esquerda? Deslocar um bit para direita significa dividir um nmero por 2 e para a esquerda multiplicar ele por 2. 6. O caractere de controle \n corresponde a uma nova linha e aparece na literatura como parte do conjunto de caracteres de controle PHP. Por que os navegadores no respondem a esse controle? Esses caracteres de controle so atuantes na tela do computador local, mas no no navegador, pois os navegadores entendem e obedecem somente os controle HTML. 7. O que escopo de uma varivel? O escopo, apesar da palavra complicada, tem uma explicao simples: tempo de vida de uma varivel e, em outras palavras, o tempo que ela permanece na memria. Se for uma varivel global, ela permanecer viva durante toda a execuo do programa ou script, se for local, ela viver apenas durante a execuo da funo que a criou. 8. Sobre uma varivel static, pode-se dizer que: uma varivel definida localmente, dentro de uma funo, porm ela ser mantida viva, na memria, e seu valor ser preservado na execuo do script, mesmo quando a funo for encerrada. Quando a mesma funo for invocada novamente, a varivel esttica ter o mesmo valor quando a funo foi encerrada pela ltima vez. Esta tcnica d para a varivel uma visibilidade local, o que significa que ela s pode ser acessada dentro da funo, porm seu valor mantido vivo durante o escopo global. 9. Explique as quatro formas de se criar arranjos (arrays) em PHP. Forma 1:
$arr = Zero, Um, Dois, Trs;
Forma 2:
$arr[0] = Zero; $arr[1] = Um; $arr[2] = Dois; $arr[3] = Trs;
Forma 3:
$cor = array(0=>Zero, 1=> Um, 2 => Dois, 3=>Trs);
Forma 4:
$cor = array(Zero, Um, Dois, Trs); PROGRAMAO I (PHP) | Educao a Distncia
89
10. O que uma lista e no que ela difere de um arranjo (array)? Uma lista um conjunto de variveis independentes, j um array uma sequncia de valores contguos. Uma lista de variveis pode receber os valores de cada posio do array. 11. Liste todas as variveis externas e variveis de ambiente do PHP utilizando a funo PHPInfo().
<? PHPinfo(); ?>
SICA, Carlos. PHP Orientado a Objetos. Rio de Janeiro: Editora Cincia Moderna, 2006. ISBN: 8573935530. SICA, Carlos. PHP Com tudo. Rio de Janeiro: Editora Cincia Moderna, 2011. ISBN: 9788539900022. SICA, Carlos. Programao Segura utilizando PHP. Rio de Janeiro: Editora Cincia Moderna, 2007. ISBN: 9788573936087.
Veja neste site da Universidade Federal do Rio Grande do Sul um tutorial sobre Protocolos Cliente Servidor que pode ser til para voc reforar seu conhecimento sobre o tema Cliente Servidor. <http://penta2.ufrgs.br/redes296/cliente_ser/tutorial.htm>. O site da W3Schools oferece um conjunto de tutoriais, em muitos casos, voc poder at mesmo testar o cdigo-fonte que est aprendendo. um ambiente de autoaprendizagem que poder ajudar
90
muito no seu curso. Nesta unidade, leia sobre PHP no link indicado. <http://www.w3schools.com/php/>. O Site ofi cial do PHP o <php.net>, ali voc vai encontrar tudo sobre PHP de todas as verses que j foram lanadas. No uma ferramenta de aprendizagem, mas um repositrio de consulta com muitos exemplos. Voc encontrar neste site um contedo estilo manual de utilizao. <http://www.php.net/manual/en/index.php>. O site Wikipedia uma enciclopdia aberta, na qual todos podem escrever. Existem revisores, mas como ela trata de todos os assuntos de conhecimento, use o contedo com parcimnia, pois uma referncia ainda em construo. <http://pt.wikipedia.org/wiki/PHP>.
COnSIdeRAeS FInAIS
Nesta unidade, aprendemos todos os smbolos e algumas funes bsicas para criar programas bem simples escritos na linguagem PHP. Este apenas o comeo, mas voc ter oportunidade de se tornar um grande programador para Internet, estudando e aprendendo os outros mdulos que seguem. Veremos agora como construir programas mais complexos utilizando as estruturas tradicionais de programao. Vamos aprender como comparar variveis e constantes, repetir trechos de programas e tambm como programar em mdulos chamados funes. Vamos continuar?
AtIVIdAde de AutOeStudO
1. Com este contedo, voc j pode escrever um pequeno script por sua conta. Desenvolva um programa em PHP que receba um nmero pelo mtodo GET e calcule a raiz quadrada dele, apresentando o resultado na tela do navegador, formatado como segue: A raiz quadrada de 25 : 5.
91
UNIDADE III
ESTRUTURAS DE PROGRAMAO
Professor Me. Carlos Sica Objetivos de Aprendizagem Aprender as estruturas de comparao e repetio. Entender sobre desvios de fluxo de programa. Ser capaz de desenvolver um pequeno programa iterativo para a Internet. Plano de Estudo A seguir, apresentam-se os tpicos que voc estudar nesta unidade: Quais so as estruturas de comparao, deciso ou seleo e como aplic-las Quais so as estruturas de repetio ou iterao e como aplic-las Quais so os desvios explcitos
INTRODUO
Um programa, por princpio, uma sequncia de comandos que sero executados um a um criando um fluxo natural de execuo. Este fluxo natural e sequencial pode ser quebrado quando, por deciso do prprio programa, segundo determinas condies, resolve mudar a sequncia. Na nossa vida tambm assim, vamos ver um exemplo. Se estivermos caminhando no parque e sentirmos sede, temos que parar e tomar gua. Interrompemos, ento, o fluxo normal da caminhada, desviando do caminho, para matar a sede. Uma estrutura de deciso tem esta semelhana lgica: estou caminhando, se sinto sede, tomo gua, seno continuo caminhando. Outro exemplo bacana quando voc chega lanchonete e se depara com vrias opes para matar a sede, por exemplo, gua, gua de coco e suco. Esta unidade trata estes tipos de deciso, entre outras e, alm disso, d um destaque para o conceito de desvio de fluxo do programa.
95
utilizada para comparar dois valores. Eles podem estar contidos em duas variveis ou em uma varivel e uma constante. O objetivo selecionar uma opo entre as duas possveis: a verdadeira ou a falsa. A execuo da segunda opo significa um desvio condicional de fluxo de execuo do programa. A forma geral da sentena que utiliza o comando em ingls if :
if(expresso){ Lista de comandos 1; }else{ Lista de comandos 2; }
Neste tipo de estrutura, a clusula else opcional, quando ela for omitida, apenas a primeira lista de comandos estar em julgamento.
if(expresso){ Lista de comandos; }
A expresso de comparao vai selecionar um deles, mas nunca ambos. A frase Lista de comandos 1 e Lista de comandos 2 podem representar um nico comando, um bloco de comandos ou nada, pois a linguagem permite o uso de um bloco vazio, desde que limitado pelos smbolos de abre e fecha chaves. Quando se tratar de um nico comando, os smbolos de abre e fecha chaves podem ser omitidos sem prejuzo para o programa. O resultado da expresso pode ser fruto de: Uma comparao entre o contedo de duas variveis ou de uma varivel e uma cons-
96
tante, com a utilizao de qualquer operador relacional constante no item Operadores relacionais. Exemplo 1:
if($nome == Carlos) echo(O nome $nome foi encontrado!); else echo(O nome $nome NO foi encontrado!);
Da chamada de uma funo que retorna um valor booleano como a isset() descrita no item Verificando se uma varivel possui um valor e gettype() descrita no item Verificao do tipo de uma varivel. Exemplo 2:
if(!isset($nome)) echo(A varivel nome est vazia!); else echo(O nome : $nome!);
Do teste do valor de uma varivel. Semelhante ao exemplo anterior, este teste vai falhar se a varivel estiver vazia (NULL). Exemplo 3:
if($nome) echo(O nome : $nome); else echo(A varivel \$nome est vazia);
E, por ltimo, de uma pesquisa em um banco de dados, que ser estudado no Livro II. O Encadeamento se/seno/se Uma construo comum em programao o encadeamento if-else-if, com a qual possvel
97
criar uma sequncia de comparaes asselhando-a a uma estrutura de escolha mltipla. O seguinte exemplo ilustra esta construo:
if( condio1 ) Lista de comandos 1; elseif( condio2 ) Lista de comandos 2; elseif( condio3 ) Lista de comandos 3; else Lista de comandos 4;
As expresses condicionais so avaliadas de cima para baixo. Assim que uma condio verdadeira encontrada, a declarao associada a ela executada e o resto do encadeamento ignorado. Se nenhuma das condies for verdadeira, ento entra em ao o else final, que atua como uma condio padro; isto , se todos os testes condicionais falharem, a ltima declarao else ser executada. Se o else final no estiver presente e todas as outras condies forem falsas, ento nenhuma ao ser realizada. Operador ternrio ? O operador ternrio ? trabalha da seguinte forma:
expressao ? valor_caso_verdadeiro : valor_caso_falso;
Se a expresso for verdadeira, retornar valor_caso_verdadeiro, caso a expresso seja falsa, retornar valor_caso_falso. Exemplo:
$x = $y > 0 ? $y : 0;
98
O trecho de cdigo mostrado atribui varivel $x um valor de acordo com a expresso $y > 0, ou seja, se $y for maior que 0 (zero), $x receber o prprio valor de $y, porm se $y for um valor negativo, $x receber 0 (zero). Veja como ficaria o mesmo exemplo em um cdigo convencional:
if($y > 0) $x = $y; else $x = 0;
A forma simplificada deste trecho, utilizando o operador ternrio ?, fica da seguinte forma:
$z = $a > 0 ? -99 : 99;
Comparaes com o switch/case O PHP tem ainda um comando de seleo com mltiplas opes: o switch. Esta estrutura testa sucessivamente o valor de uma expresso, comparando o resultado dela com uma lista de constantes inteiras ou de caracteres. Quando o valor coincide, os comandos associados quela constante so executados. A forma geral do comando switch :
switch(expresso){ case constante1: sequncia_de_comandos; break; case constante2: sequncia_de_comandos;
99
A declarao default opcional e corresponde a nenhuma das alternativas anteriores. O comando break (veja detalhes no item COMANDOS DE DESVIO) um dos comandos de desvio do PHP, ao encontr-lo, o ponto de execuo salta para o prximo comando aps o bloco do comando switch, delimitado pelo fecha chaves. A ltima sequncia de instrues, a do bloco default, no precisa ser delimitada pelo break porque o sinal de fecha chaves realiza esta tarefa, encerrando a estrutura do comando switch.
Se, por exemplo, o break da sequncia de comandos pertencentes constante2 no existisse e essa constante fosse selecionada, os comandos da constante3 tambm seriam executados at que o break fosse encontrado ou a estrutura switch fosse encerrada.
para-faa O comando da linguagem que implementa esta estrutura o for, do ingls, para. uma estrutura de repetio que tem o nmero de ocorrncias definido previamente. Sua forma geral :
for (inicializao; condio; incremento) sequncia-comandos;
A inicializao feita por um comando de atribuio usado para colocar um valor na varivel de controle do lao. A condio uma expresso relacional que determina quando o lao acaba. Muito CUIDADO deve ser tomado no estabelecimento dessa condio, pois no se aceita o operador relacional
Fonte: SHUTTERSTOCK.com
101
==, somente os seguintes: <, >, <= e >=, porque a relao estabelecida pela palavra-chave enquanto, por exemplo: repita enquanto $i < 19. O incremento define como a varivel de controle do lao varia cada vez que o lao repetido. Na verdade, esse incremento pode ser um decremento caso o valor da inicializao seja maior que o critrio de parada. Alm disso, pode ser inteiro ou real. Estas trs sees principais devem ser separadas por pontos e vrgulas. Uma vez que a condio se torna falsa, a execuo do programa continua no comando seguinte ao for. Nos prximos exemplos desta unidade, os 3 pontinhos entre chaves {...} significam a sequncia de comandos a ser executada. Exemplos:
// repete enquanto menor que 10, portanto, de 0 a 9 for ($i = 0; $i < 10; $i++) {...} // repete enquanto menor que 10, portanto, de 0 a 9.5 for ($i = 0; $i < 10; $i+=0.5) {...} // repete enquanto maior que 0, portanto, de 10 a 1 for ($x = 10; $x > 0; $x--) {...}
O formato geral do lao for da linguagem PHP permite uma flexibilidade admirvel. Para aclarar esta afirmao, algumas variaes dessa estrutura so apresentadas a seguir: permitido que duas variveis controlem o lao, para tanto, se usa o operador vrgula que denota a necessidade de duas aes.
for ($x = 0, $y = 0; $x+$y < 10; ++$x) {...}
Supondo que a varivel de controle j tenha sido definida e inicializada, pode-se criar um lao for sem a parte de inicializao das variveis de controle.
for ( ; $x < 9; $x++) {...}
possvel, tambm, criar um lao infinito que executar o bloco de comandos indefinidamente at que um comando break seja encontrado no bloco. Para se conseguir esse efeito, preciso usar a sintaxe abaixo, sem definir nenhuma varivel ou controle.
for ( ; ; ) {...}
Concluso: qualquer um dos parmetros de for pode ser suprimido sem acarretar erros de sintaxe. Exemplo 1: Escreve a tabuada do 7.
$tab = 7; for ($i = 1 ; $i <= 10 ; $i++) echo($tab.*.$i.=.$i*$tab.<br>); Exemplo 2: Escreve as tabuadas dos nmeros 2 a 10. $min = 2; $max = 10; for ($tab = $min; $tab <= $max; $tab++) for ($i = 1; $i <= 10; $i++) echo($tab.*.$i.=.$i*$tab.<br>);
Exerccio: Repita este exemplo em um programa PHP, mas apresente as tabuadas resultantes em forma de tabela HTML.
enquanto-faa Esta estrutura tem uma funo de repetio que pode repetir um bloco de instrues sem que saibamos o nmero de vezes previamente. Seguindo aquela linha humana de exemplos, como tomar gua: tome um gole, e se ainda
103
tiver sede, tome outro, seno pare. Voc no sabe quantos goles sero necessrios para matar sua sede, mas sabe que a hora que estiver satisfeito parar de beber. Forma geral:
while(condio) comando;
Para o qual, a palavra comando pode ser um comando vazio, um comando simples ou um bloco de comandos. A palavra condio pode ser uma varivel ou uma expresso cujo resultado ser avaliado. O lao (bloco de comandos) se repete enquanto a condio verdadeira. quando for falsa, o controle do programa passar para a linha aps o cdigo do lao.
O exemplo abaixo calcula a temperatura em graus centgrados com base nos graus fahrenheit dos nmeros compreendidos entre 0 a 300.
$menor=0; $maior=300; $fahr = $menor; while ($fahr <= $maior){ $celsius = 5 * ($fahr-32) / 9; if($fahr == 0) $fahr = 000; if(($fahr >= 10) && ($fahr <= 90)) $fahr = 0.$fahr;
faa-enquanto Ao contrrio do lao for e while, o lao do-while testa a condio de parada no final do lao. Isso significa que o conjunto de comandos executado obrigatoriamente uma vez ao menos. Se voc tem algumas notas de dinheiro na sua carteira e vai pagar uma conta, naturalmente pelo menos uma nota ser utilizada. D uma nota, se o valor no for atingido, d outra nota, repita isto at que o valor total seja atingido. Forma geral:
do{ comandos; } while(condio);
105
para cada Este um tipo de repetio muito peculiar no PHP. Nem todas as linguagens implementam esta estrutura de repetio. O construtor foreach utilizado para executar laos de repetio sobre arranjos, portanto, ocorrer um erro se for utilizado sobre variveis de qualquer tipo diferente do tipo array ou mesmo em variveis deste tipo, mas no inicializadas. Esta estrutura cria um contador interno que inicializado em zero, quando o foreach inicia a primeira iterao, significa que ele aponta para o primeiro elemento do array que est sendo operado. Exemplo:
$vetor = array(3, 5, 9, 11); foreach($vetor as $valor){ echo(Valor atual de \$vetor $valor<br>); }
Resultado: Valor atual de $vetor 3 Valor atual de $vetor 5 Valor atual de $vetor 9 Valor atual de $vetor 11 Este exemplo pode ser interpretado assim: para cada (foreach) posio do arranjo denominado $vetor, leia o respectivo valor e o atribua varivel $valor e aps isto imprima valor atribudo.
Os ndices do arranjo tambm podem ser consultados e mostrados para promover uma ilustrao. Exemplo:
$vetor = array(3, 5, 9, 11); foreach($vetor as $i => $valor){ echo(Valor atual de \$vetor[$i] $valor<br>); }
Resultado: Valor atual de $vetor[0] 3 Valor atual de $vetor[1] 5 Valor atual de $vetor[2] 9 Valor atual de $vetor[3] 11 Na realidade, ao executar o foreach, o servidor PHP cria um novo arranjo, espelho do original, composto por referncias (semelhantes aos ponteiros), a partir do qual possvel ler todos os dados do original sem acess-lo diretamente. Porm, se for necessrio alterar os dados do array operado possvel. Para isso, necessrio utilizar as referncias criadas para cada item dele.
As referncias so os endereos de memria de cada item que compe o arranjo original. Voc pode aprender um pouco mais sobre isto no item Passagem de parmetros por referncia.
107
Exemplo:
$vetor = array(3, 5, 9, 11); // mostra o arranjo original foreach($vetor as $i => $valor){ echo(Valor atual de \$vetor[$i]: $valor<br>); } // modifica o arranjo foreach($vetor as &$valor){ $valor = $valor * 2; } // mostra o arranjo com novos valores foreach($vetor as $i => $valor){ echo(Valor atual de \$vetor[$i]: $valor<br>); } unset($value); // desfaz a referncia com o ltimo elemento
Neste exemplo, todos os elementos do vetor sero multiplicados por 2, e o script apresenta o seguinte resultado: Valor atual de $vetor[0]: 3 Valor atual de $vetor[1]: 5 Valor atual de $vetor[2]: 9 Valor atual de $vetor[3]: 11 Valor atual de $vetor[0]: 6 Valor atual de $vetor[1]: 10 Valor atual de $vetor[2]: 18
Valor atual de $vetor[3]: 22 A mesma tcnica utilizada para matrizes (arranjos bidimensionais), como mostra o exemplo a seguir:
$matriz = array(); $matriz[0][0] = 0x0; $matriz[0][1] = 0x1; $matriz[1][0] = 1x0; $matriz[1][1] = 1x1; foreach($matriz as $linha=>$v1){ foreach($v1 as $coluna=>$v2){ echo([$linha][$coluna] = $v2<br>); } }
COMANDOS DE DESVIO
Break O comando break tem dois usos: terminar um comando switch ou forar a terminao imediata de um lao de repetio, ignorando o teste condicional normal do lao. O exemplo a seguir ilustra o funcionamento do switch sem o break. Se constante1 for selecionada, somente a sequncia1 de comandos ser executada. Porm, se constante2 for selecionada, todas as prxima sequncias (2, 3 e default) sero executadas. Se constante3 for selecionada, a sequncia3 e a referente ao bloco default sero executadas.
PROGRAMAO I (PHP) | Educao a Distncia
109
switch(expresso){ case constante1: sequncia1_de_comandos; break; case constante2: sequncia2_de_comandos; case constante3: sequncia3_de_comandos; ... default: sequncia_de_comandos; }
Um exemplo com o comando break aplicado dentro de um lao de repetio visto a seguir:
for($t = 1; $t < 100; $t++){ echo($t. ); if ($t == 10) break; }
Este script escreve os nmeros de 1 at 10 na tela do navegador. O lao termina porque o break provoca uma sada imediata do lao, desrespeitando o teste condicional t < 100. Resultado: 1 2 3 4 5 6 7 8 9 10 Continue O comando continue trabalha de forma parecida com o break. A diferena que enquanto o comando break provoca o trmino do lao, o comando continue fora o fluxo do programa a passar para a prxima iterao, pulando qualquer cdigo que houver entre ele e o final do
Repare que o comando else no foi necessrio, porque o continue se encarrega de saltar as prximas linhas de comando sem que elas sejam executadas. Resultado: Neste exemplo, o continue evita a diviso por zero. 1/1 = 1 1/2 = 0.5 1/3 = 0.333333333333 1/4 = 0.25 1/5 = 0.2
111
1/6 = 0.166666666667 1/7 = 0.142857142857 1/8 = 0.125 1/9 = 0.111111111111 Return O construtor return normalmente utilizado para encerrar uma funo, retornando ou no um valor ao chamador. Um chamador pode ser o programa principal ou outra funo. Aprenda sobre isto no item Funes definidas pelo usurio. Se return tem um valor associado a ele, esse valor o valor de retorno da funo, caso contrrio o valor de retorno vazio. Forma geral:
return expresso; return constante; return;
Opcionalmente:
return(expresso); return(constante); return();
As palavras expresso e constante, portanto, so opcionais, visto que nem sempre uma funo necessita retornar um valor ao final da sua execuo. Os parnteses podem ser utilizados, mas no so necessrios, visto que return no uma funo, mas um construtor da linguagem. Ns preferimos utilizar por esttica e profissionalismo.
Se uma constante estiver presente na sentena, se tornar o valor de retorno da funo, e no caso de uma expresso, o valor de retorno o resultado dela. possvel utilizar quantos comandos return forem desejados dentro de uma funo, contudo, a funo ser interrompida to logo encontre o primeiro. Exemplo:
function teste(){ $var = 34; if($var > 3) return(1); else return(9); } $valor = teste(); echo($valor);
Se o construtor return() for utilizado no escopo global, o script ser encerrado, pois estaria retornando para o chamador que o prprio navegador.
Exit/Die O construtor exit interrompe o processamento do script; ele possui um construtor equivalente ou sinnimo: die. Forma geral:
113
Para encerrar o programa retornando um cdigo de erro, utilize um valor inteiro entre 1 e 254, pois o 0 (zero) simboliza encerramento normal e o 255 est reservado pelo PHP. Os cdigos de erro no so mostrados na tela do navegador, servem apenas para controle do sistema ou navegador.
exit(1); exit(0376); // octal exit(0x2A); // hexadecimal
eStudO dIRIGIdO
1. Cite as estruturas de deciso que tambm podem ser chamadas de seleo ou comparao. So duas (if e switch). a primeira pode ser utilizada de trs maneiras: (if) (if-else) (if-else-if) a segunda a (switch-case) que escolhe uma opo dentre muitas. 2. Cite as estruturas de repetio ou iterao. So trs tradicionais e uma especfica para arrays: for, do-while, while-do e foreach. 3. Cite todos os desvios explcitos e explique em que momentos podem ser utilizados e quando so obrigatrios. So eles: O break, que utilizado obrigatoriamente na estrutura switch-case. O return, que utilizado em funes que retornam valores. O continue, que desvia o fluxo sem promover ao. O exit, que encerra a execuo de um script.
SICA, Carlos. PHP Orientado a Objetos. Rio de Janeiro: Editora Cincia Moderna, 2006. ISBN: 8573935530. SICA, Carlos. PHP Com tudo. Rio de Janeiro: Editora Cincia Moderna, 2011. ISBN: 9788539900022. SICA, Carlos. Programao Segura utilizando PHP. Rio de Janeiro: Editora Cincia Moderna, 2007. ISBN: 9788573936087.
115
O site da W3Schools oferece um conjunto de tutoriais, em muitos casos, voc poder at mesmo testar o cdigo-fonte que est aprendendo. um ambiente de autoaprendizagem que poder ajudar muito no seu curso. Nesta unidade, leia sobre PHP no link indicado. <http://www.w3schools.com/php/>. O site Wikipedia uma enciclopdia aberta, na qual todos podem escrever. Existem revisores, mas como ela trata de todos os assuntos de conhecimento, use o contedo com parcimnia, pois uma referncia ainda em construo. <http://pt.wikipedia.org/wiki/PHP>.
COnSIdeRAeS FInAIS
As linguagens de programao mais poderosas do mundo so construdas com estruturas de deciso e estruturas de repetio, como as que foram estudadas nesta unidade. A estrutura foreach modernizou e tornou automtica a forma de tratar arranjos. A linguagem PHP herdou a sistemtica da linguagem mais utilizada no mundo, a linguagem C, e utiliza a sintaxe muito parecida tambm. Este fato induz a pensarmos que alm de aprender a programar com a linguagem de maior produtividade para a Internet, estamos indiretamente aprendendo as mesmas estruturas e sintaxe semelhantes de linguagens como C e Java. Com a prxima unidade, que trata de funes, ns teremos feito um apanhado geral da linguagem em si. E passaremos a estudar algumas aplicaes e caractersticas especficas da Internet. A programao com funes vai incrementar seu aprendizado, te dando condies de entender toda a sistemtica da programao mais conhecida no mundo: a Programao Modular.
AtIVIdAde de AutOeStudO
Escreva um switch-case que selecione a faixa de valores de 0 a 3 e de 17 a 20.
UNIDADE IV
PROGRAMAO MODULAR
Professor Me. Carlos Sica
Objetivos de Aprendizagem Aprender a estruturao de um programa em mdulos. Ser capaz de desenvolver um pequeno programa modular.
Plano de Estudo A seguir, apresentam-se os tpicos que voc estudar nesta unidade: O que funo e onde ela se aplica Como enviar dados parmetros para uma funo Como receber dados resultantes de uma funo Passagem de parmetros por valor e referncia
INTRODUO
Na dcada de 60, surgiu a ideia de dividir os problemas em partes distintas e quando fosse transposto para um programa de computador, o mesmo deveria ser dividido em mdulos independentes, cada um resolvendo uma parte especfica do problema. O desenvolvimento de sistemas computacionais sem metodologia induz o programador a criar um software com erros, o que acarreta em alto custo de desenvolvimento e manuteno. Um mdulo definido como um agrupamento de linhas de comando, significando assim uma parte do algoritmo que resolve o problema especfico para que em conjunto com outros mdulos, resolvam o problema como um todo. As linguagens de programao chamam estes mdulos de subprogramas, subrotinas, procedimentos ou funes. A linguagem PHP trabalha somente com funes que devem ser o mais independentes possvel em relao ao resto do algoritmo. A maneira mais intuitiva de construir um programa modular definir um mdulo principal de controle, chamado programa principal, e um ou mais mdulos especficos para cada funo do algoritmo que dar soluo ao problema abordado. Como eu j havia te alertado na primeira unidade, a programao exige muita dedicao e organizao. Em geral, um programa composto por uma srie de tarefas menores que juntas completam um grande trabalho. Por exemplo, para um aluno se tornar Analista de Sistemas, preciso ser aprovado em todas as matrias. Isto feito uma por uma, e se por desventura reprovar em alguma disciplina, ele volta a estud-la para buscar a aprovao.
119
Dividir um problema em partes tcnica bsica para os vitoriosos, principalmente quando precisamos repetir uma pequena tarefa vrias vezes. Como na vida, como quando estabelecemos metas para cumprir um objetivo maior, para fazer um bom programa de computador precisamos nos organizar e realizar cada tarefa ordenadamente. As funes tm justamente este objetivo, dividir o problema em pequenas partes, em especial, separar em pequenas tarefas que podem ser feitas algumas vezes at que o propsito completo esteja cumprido. Vamos pensar em um restaurante. Cada um tem sua funo: receber o pedido, levar para a cozinha, cozinhar, lavar a loua, servir a mesa, cobrar e assim por diante. Cada um faz o que sabe melhor. Em um programa, cada funo tem que executar um trecho do programa, por exemplo, calcular a raiz quadrada de um nmero. J pensou se voc, programador, tivesse que reescrever essa funo em vrias partes de um programa? Em muitas linguagens, algumas funes, como essa a, a raiz quadrada, j esto prontas, outro programador escreveu o cdigo e deixou pronto para voc usar, mas existem outras que voc mesmo deve escrever.
Funo um dos conceitos mais importantes da matemtica. Existem vrias definies, dependendo da forma como so escolhidos os axiomas. Uma relao entre dois conjuntos, onde h uma relao entre cada um de seus elementos. Tambm pode ser uma lei que para cada valor x correspondido por um elemento y, tambm denotado por (x) (FUNO, in: Wikipdia, online).
FUNO
Uma funo relaciona uma entrada com uma sada. A sada sempre depende da entrada.
Exemplo: Multiplique por dois uma funo muito simples e podemos identificar facilmente as trs partes: Entrada 0 1 2 3 ... Fonte: o autor A funo Quadratura uma funo bsica e representada por f(x)=x2. As funes seno, cosseno e tangente so funes usadas em trigonometria (f(x)=seno(x)), mas existem muitas outras que voc mesmo pode concluir. No estudo da matemtica, muito comum utilizar o f para nomear uma funo, mas voc pode ter outros nomes como g ou mesmo suco se voc quiser. Neste caso, a entrada a fruta, a relao a liquefao e a sada, o suco. Mas vamos usar o f, que muito utilizado neste tipo de estudo. Na funo quadrtica que j exemplificamos, vamos dizer que f de x igual ao quadrado x e representar f(x)=x2, e quando for aplicado algum valor para x, por exemplo x=4, a notao fica f(4)=16. Vamos agora pensar como ficaria a representao da funo suco? Relao 2 2 2 2 ... Sada 0 2 4 6 ...
121
Podemos representar assim: suco (fruta)=liquefazer fruta; e aplicar assim: suco(cana)=garapa. Quando estiver projetando uma funo, tem que tomar muito cuidado com os possveis valores de entrada. Por exemplo, no se pode realizar uma diviso por zero, ento a funo f(x)=x/n deve levar em conta que n nunca poder ser zero. Outro exemplo a raiz quadrada que no pode ser calculada com valores negativos. Nesta linha, um exemplo de funo da nossa vida vestir-se. Entrada: roupas. Relao: vestir. Sada: vestido. Porm, devem ser considerados muitos fatores, por exemplo, um beb, mesmo do sexo feminino, no poderia utilizar suti. Quando estiver programando, projete sua funo para que no aconteam disparidades funcionais. Na computao, isto chamado de consistncia. Voc, programador, deve sempre cuidar para que os valores de entrada atendam as necessidades bsicas da relao estabelecida em cada funo, para que os valores de sada sejam fidedignos. Vamos estabelecer, ento, as regras especiais: Cada funo deve funcionar corretamente para cada valor de entrada possvel. S possvel ter uma relao para cada valor de entrada, o que significa que sempre que a funo receber um determinado valor de entrada, ela deve produzir o mesmo resultado.
Analisando por outro lado, podemos dizer que vrias entradas podem produzir resultados iguais, por exemplo, a funo quadrtica pode receber valores de entrada positivos e negativos, operar sobre eles e produzir resultados iguais. Entrada -2 -1 0 1 2
Fonte: o autor
Relao X2 X2 X2 X2 X2
Sada 4 1 0 1 4
Esta a funo da parbola. Na computao, o x chamado de parmetro de entrada ou de argumento, mas precisamos esclarecer que uma funo pode ter mais de um parmetro. Por exemplo, a funo suco deveria levar em considerao outros parmetros de entrada, alm da fruta, tal como acar, adoante, gelo e agua. Se for um suco com mais de um sabor mesclado, ento deveria levar em conta outras frutas como entrada. Uma equao uma expresso matemtica que possui em sua composio uma ou mais incgnitas, coeficientes, expoentes e um sinal de igualdade. As equaes so caracterizadas de acordo com o maior expoente de uma das incgnitas. No nosso contexto, podemos lembrar que em uma funo de segundo grau, onde ax2 + bx + c = 0, temos que levar em conta trs parmetros de entrada: a, b e c para encontrar os possveis valores de x.
123
ns isolamos o trecho do cdigo em uma funo quando o mesmo tiver que ser utilizado mais de uma vez, ou ainda, por questes de modularidade e portabilidade. Um nome de funo vlido comea com uma letra ou um sublinhado, seguido por qualquer nmero de letras, nmeros ou sublinhado. A sintaxe bsica para definir uma funo :
function nome_da_funo([lista de parmetros formais]){ lista de comandos; [return <valor de retorno>]; }
Os smbolos entre colchetes [] indicam que o contedo opcional, significa que uma funo pode ou no conter parmetros e pode ou no retornar um valor. O primeiro caso a lista de parmetros formais, que significa que um mdulo pode ou no receber dados para executar sua funo. Se a funo receber um ou mais parmetros, eles sero utilizados para efetuar algum clculo. O segundo caso o valor de retorno, que significa que uma funo pode ou no retornar um resultado, como um clculo realizado.
Parmetros tambm so conhecidos como argumentos e so os valores de entrada de uma funo, nos quais ela vai se basear para fornecer um nico resultado como sada.
Exemplo: Clculo da raiz quadrada de um nmero considerando as razes imaginrias, que o caso de entradas negativas.
function raiz(x){ if(x < 0){ x = x * (-1); return(sqrt(x). i); // raiz imaginria }else{ return(sqrt(x)); // raiz real }
Exemplo: Clculo das razes de uma equao de segundo grau pela frmula de Bhskara.
x=
- b ! b2 - 4ac 2a
Para resolver esta equao, temos que considerar a frmula (relao) e os possveis valores de entrada. Como teremos valores positivos e negativos na frmula que calcula o delta, temos ento que promover a consistncia logo na entrada da funo.
9 = b2 - 4ac
function bhaskara($a,$b,$c){ $delta = ($b*$b) - (4 * $a * $c); // inicializa um array com as respostas $x[0] = $delta; if($delta < 0){ $delta = $delta * -1; $x[1] = ((-($b) + sqrt($delta)) / 2 * $a) . *i; $x[2] = ((-($b) - sqrt($delta)) / 2 * $a) . *i; }else{ $x[1] = (-($b) + sqrt($delta)) / 2 * $a; $x[2] = (-($b) - sqrt($delta)) / 2 * $a; } return($x); // retorna um arrray }
125
Chamada da funo: como a funo bhaskara retorna um array, devemos imprimir o resultado como tal. A primeira posio, $x[0], contm o valor de $delta, e as outras $x[1] e $x[2] contero as razes, respectivamente.
echo(<pre>); print_r(bhaskara(1, 2, 3)); echo(<pre>);
Outra forma de imprimir os resultados atribuir o retorno da funo para um array e trabalhar com ele depois.
$resultado=bhaskara(1,2,3); foreach($resultado as $x){ echo($x <br>); }
Finalmente, podemos concluir que qualquer cdigo PHP vlido pode estar contido no interior de uma funo, delimitado pelos parnteses. Uma novidade dentro do ambiente PHP que as funes no precisam ser criadas antes de serem referenciadas. Por isto possvel criar funes de trs formas: Condicionalmente. Dentro de outra funo. Recursivas.
Funes definidas condicionalmente Uma funo pode ser definida dependendo de uma condio avaliada pelas estruturas if-else ou switch-case. Neste caso, elas podem ser referenciadas antes de serem criadas. Exemplo: Esta funo s ser criada quando o programa passar por aqui, ou seja, se a varivel
$avalia for diferente de falsa quando o programa passar por este trecho.
if ($avalia) { function existe() { echo Esta funo s ser criada quando o programa passar por aqui.<br>; } }
Funes criadas condicionalmente so teis para economizar memria, pois somente faro uso deste recurso se forem realmente criadas. Funes dentro de funes Tambm possvel criar ou declarar uma funo dentro de outra, mas mesmo assim, ela ter escopo global, o que significa que poder ser invocada por qualquer outra funo ou pelo programa principal. Exemplo:
function primeira() { function segunda() { echo Esta funo s ser criada quando a funo primeira for invocada.; } }
Todas as funes tm escopo global, assim, elas podem ser chamadas fora de uma funo mesmo que tenham sido defi nidas dentro e vice-versa.
127
Valor de retorno Uma funo pode retornar o resultado da sua execuo para o chamador utilizando o operador return, sendo que um chamador pode ser o programa principal ou outra funo. A funo se encerra quando: Encontra um return com ou sem valor de retorno que caracteriza o resultado da funo a ser retornada para o chamador; ou quando encontra o fecha parnteses, neste caso no retornar nenhum valor para o chamador.
Toda funo pode opcionalmente retornar um valor, e como a checagem de tipos no PHP dinmica, o tipo de retorno no precisa ser declarado, mas necessrio que o programador esteja atento para que a funo retorne o tipo desejado. Esse valor retornado do nome da funo, fato que torna esse nome semelhante ao de uma varivel, ou seja, a ele est associada uma posio de memria onde ser armazenado um determinado valor de um determinado tipo. O valor atribudo ao nome da funo no corpo dela com a utilizao do comando return. Como j foi visto anteriormente, o comando return utilizado para encerrar a execuo de uma funo e retornar ao chamador, que pode ser o programa principal ou outra funo. A sintaxe geral :
return(expresso); return(constante); return(); return;
As palavras expresso e constante, portanto, so opcionais, visto que nem sempre uma funo necessita retornar um valor ao final da sua execuo.
Se uma expresso estiver presente, o resultado da expresso se tornar o valor de retorno da funo, e uma atribuio ser feita ao nome da funo exatamente como uma varivel.
Se uma constante estiver presente, o valor da constante se tornar o valor de retorno da funo, e uma atribuio ser feita ao nome da funo exatamente como uma varivel.
O programador pode utilizar quantos comandos return forem necessrios dentro de uma funo, contudo, a funo ser interrompida to logo encontre o primeiro. Portanto, somente um ser executado. Exemplo1: trecho que escolhe um resultado para ser retornado no nome da funo.
switch(teste){ case 0: return($a); case 1: return($a * 2); case 2: return($a / 2); default: return(0); }
Exemplo 2: trecho que escolhe um resultado para ser retornado no nome da funo.
if($a < 2) return($a * 2); }else{ return($a / 2); }
No possvel que uma funo retorne mais de um valor, mas permitido fazer com que uma funo retorne um valor composto, tal como uma lista ou um array.
129
Caso a funo no encontre nenhum return, ela ser encerrada quando encontrar o fecha parnteses.
Parmetros de entrada Os parmetros so as informaes que entram na funo, pois a mesma precisa delas para realizar determinada tarefa a qual ela foi incumbida.
As informaes que saem dela so explicadas no item Passagem de parmetros por referncia e no item anterior, Valor de retorno.
Esses parmetros so passados pelo cdigo que chama a funo (lista de parmetros formais) e, dentro dela, eles se comportam como variveis locais. Exemplo:
function imprime($texto){ echo($texto); }
Chamada:
imprime(teste de funes com parmetros);
possvel, portanto, passar parmetros (ou argumentos) para uma funo. Para tanto, devem ser declarados logo aps o nome da funo, entre parnteses, e se tornam variveis pertencentes ao escopo local da funo. Existem duas formas de passagem de parmetros: por valor e por referncia. Passagem de parmetros por valor Na passagem de parmetros por valor, possvel passar uma constante ou o valor de uma varivel para a funo chamada. Neste segundo caso, o cdigo da funo pode utilizar o contedo da varivel, sem que o contedo original dela seja alterado. Exemplo:
function soma($numero){ $numero += 5; echo Dentro da funo: $numero; }
Chamada:
$a = 3; soma($a); echo(No programa chamador: $a);
Resultado:
Dentro da funo: 8 No programa chamador: 3
No exemplo acima, como a passagem de parmetros por valor, a funo soma no interfere no valor original da varivel passada como parmetro, j que aps a execuo da funo, o valor da varivel preservado.
131
Isto acontece porque a funo no conhece o endereo da varivel, apenas seu valor. Sem ela saber onde alterar o valor, no poder efetuar esta mudana.
Passagem de parmetros por referncia Passar um parmetro por referncia significa passar o endereo de memria daquela varivel. No exemplo anterior, se a passagem fosse feita por referncia, a varivel $a teria 8 como valor ao final da funo. Existem duas maneiras de fazer com que uma funo receba parmetros passados por referncia: indicando na declarao da funo que se espera receber um endereo e no um valor; e na prpria chamada da funo pode-se especificar que o chamador est passando um endereo e no um valor.
Nos dois casos, utiliza-se o modificador & para indicar que se trata de um endereo e no de um valor. O exemplo abaixo demonstra as duas situaes em sequncia, acompanhe at o fim do item para entender bem o processo: Declarao da funo:
function soma(&$num1, $num2){ $num1 += 5; $num2 += 5; echo(Valores dentro da funo: a=$num1, b=$num2); }
Na declarao dessa funo, o operador modificador &, precedendo o nome da varivel, indica que o parmetro passado ser sempre o endereo dela e no seu valor. Neste exemplo, o primeiro parmetro espera receber o endereo de uma varivel e, o segundo, espera receber o valor de uma varivel ou uma constante, portanto, na chamada abaixo, a funo receber o endereo de $a e o valor de $b Chamada da funo:
$a = 3; $b = 5; soma($a, $b); echo(Valores aps a execuo da funo: a=$a, b=$b);
Resultado:
Valores dentro da funo: a=8, b=10 Valores aps a execuo da funo: a=8, b=5
Reparou que o valor da varivel $b foi mantido? Sabe responder por qu?
Porm, possvel modificar essa definio indicando o modificador & no momento da chamada da funo, criando uma sintaxe que chama a funo passando os endereos tanto de $a quanto de $b. Chamada da funo com o modificador &:
$a = 3; $b = 5; soma($a, &$b);
133
Resultado
Valores dentro da funo: a=8, b=10 Valores aps a execuo da funo: a=8, b=10
Esta segunda forma fora a passagem de um endereo (referncia) sem que a funo tenha previsto isto. Tecnicamente possvel fazer isto, mas no usual porque foge dos conceitos de programao educada.
Parmetros com valores predefinidos (default) possvel predefinir valores para os argumentos das funes. Esses valores sero assumidos no caso da funo ser chamada sem que sejam especificados argumentos. Desta forma, quando algum parmetro declarado assim, a passagem do mesmo na chamada da funo torna-se opcional. Declarao da funo:
function teste($valor = predefinido){ echo($valor); }
Chamada da funo:
teste(); teste(outro valor);
Resultados:
predefinido outro valor
Quando a funo tem mais de um parmetro, o que tem valor padro (predefinido) deve ser declarado por ltimo, como no exemplo abaixo. Declarao da funo:
function teste2($cor, $figura = circulo){ echo(A figura um $figura de cor $cor.); }
Chamada da funo:
teste2(azul);
Resultado:
A figura um crculo de cor azul.
Chamada da funo:
teste2(marrom,quadrado);
Resultado:
A figura um quadrado de cor marrom.
FUNES RECURSIVAS
A recursividade ou recurso uma ferramenta de alto grau de complexidade, mas significa simplesmente que uma funo invoca a si prpria, e isto pode acontecer repetidamente. Uma funo poder tambm ser considerada recursiva se chamar outras funes que, em algum momento, chamem a primeira funo, tornando esse conjunto de funes um processo
135
recursivo. Os resultados vo sendo empilhados, portanto, o nmero de vezes que uma funo pode ser chamada recursivamente limitado ao tamanho da pilha. Um bom exemplo da vida real para este so as imagens repetidas que aparecem quando dois espelhos so apontados um para o outro, como na figura a seguir.
Fonte: o autor
Ns temos discutido que dividir o problema em subproblemas do mesmo tipo uma forma simples de resolver o problema como um todo. Trazendo a recursividade para o nosso cotidiano: vamos contar um saco de moedas. Retire uma moeda, verifique o valor e some-o aos anteriores. A funo contar dinheiro faz um processo repetitivo, portanto de forma recursiva, mais ou menos como contar o dinheiro de cabea e falar o resultado somente no final.
Na lgica matemtica e em cincia da computao, uma definio recursiva (ou definio indutiva) usada para definir um objeto em termos de si prprio (Aczel 1977). Uma definio recursiva de uma funo define valores das funes para algumas entradas em termos dos valores da mesma funo para outras entradas. Por exemplo,
a funo fatorial n! definida pelas regras: 0! = 1. (n+1)! = (n+1)n!. Esta definio valida porque, para todo n, a recurso sempre vai alcanar o caso base de 0. Assim, a definio bem-fundada. A definio pode tambm ser vista como um procedimento que descreve como construir a funo n!, a partir de n = 0 e prosseguindo em diante com n = 1, n = 2, n = 3 etc. Uma definio indutiva de um conjunto descreve os elementos de um conjunto em termos de outros elementos no conjunto. Por exemplo, uma definio do conjunto dos nmeros naturais : 0 pertence a . Se um elemento n pertence a ento n+1 pertence a . o menor conjunto que satisfaz (1) e (2). H vrios conjuntos que satisfazem (1) e (2) - por exemplo, o conjunto {0, 0.649, 1, 1.649, 2, 2.649, 3, 3.649, ...} satisfaz a definio. No entanto, a condio (3) especifica o conjunto dos nmeros naturais, removendo os conjuntos com nmeros externos. Propriedades de funes e conjuntos definidos recursivamente muitas vezes podem ser provadas por um princpio de induo que segue a definio recursiva. Por exemplo, a definio dos nmeros naturais aqui apresentada implica o princpio da induo matemtica para os nmeros naturais: se o nmero natural 0 possui uma propriedade, e n+1 tem a propriedade sempre que n tambm a possui, ento a propriedade inerente a todos os nmeros naturais (Aczel 1978:742) (DEFINIO RECURSIVA, in: Wikipedia, online).
Estrutura Funes recursivas contm duas partes fundamentais: Condio de Parada o ponto onde a funo ser encerrada, e geralmente um limite superior ou inferior da regra geral. Regra Geral o mtodo que reduz a resoluo do problema por meio da invocao recursiva de casos menores que, por sua vez, so resolvidos pela resoluo de casos ainda menores pela prpria funo, assim sucessivamente at atingir o ponto de parada que finaliza o mtodo.
Vamos estudar agora alguns exemplos tpicos, como o somatrio e o fatorial, pois se tratam de
137
}else{ return 1; } }
Exemplo: Mximo Divisor Comum pelo processo das divises sucessivas. Nesse mtodo, so efetuadas vrias divises sucessivas at chegar a uma diviso exata. A Regra: dividir o nmero maior pelo nmero menor; 48 / 30 = 1 (com resto 18) dividir o divisor 30, pelo resto da diviso anterior (18), e assim sucessivamente; 30 / 18 = 1 (resta 12) 18 / 12 = 1 (resta 6) 12 / 6 = 2 (diviso exata) O divisor da diviso exata 6, portanto o MDC(48,30) = 6.
A funo recursiva:
function mdc($x,$y){ $a = max($x,$y); $b = min($x,$y); if($a%$b == 0){ }else{
139
ALGUMAS APLICAES
Como a PHP tem muitas caractersticas especficas, vamos dar alguns exemplos de mdulos que podem ser utilizados com certa frequncia, portanto, vale a pena serem transformados em funes. Em geral, as datas so armazenadas e recuperadas no formato americano (AAAA-MMDD), para utilizar no formato brasileiro (DD-MM-AAAA), podemos fazer duas funes para converter os formatos das datas. O primeiro exemplo utiliza uma tcnica simples com uma funo da biblioteca j conhecida por ns, a funo substr() .
function data_br($data){ // se a varivel estiver vazia retorna if(!isset($data)) return; // recebe no formato AAAA-MM-DD $dia = substr($data,8,2); $mes = substr($data,5,2); $ano = substr($data,0,4); // retorna no formato DD/MM/AAAA return($dia/$mes/$ano); }
A segunda funo faz a converso inversa, recebe a data no formato brasileiro e converte no formato americano.
function data_br_us($data){ // se a variavel estiver vazia retorna if(!isset($data)) return; // recebe no formato DD/MM/AAAA $dia = substr($data,0,2);
Para ilustrar um pouco mais, vamos fazer a segunda funo utilizando outra tcnica. A biblioteca PHP tem uma funo chamada explode() que divide um texto separado por um smbolo conhecido, neste caso a barra da data, e o coloca em um array.
function data_us($data){ // recebe no formato DD/MM/AAAA // e divide cada valor em uma posio array $data = explode(/, $data); // retorna no formato AAAA-MM-DD return ($data[2].-.$data[1].-.$data[0]); }
Validando CPF.
function valida_cpf($cpf){ if (strpos($cpf, -) != 9){ return(-1); // falta trao } if (($cpf == 000000000-00) || ($cpf == 111111111-11) || ($cpf == 222222222-22) || ($cpf == 333333333-33) || ($cpf == 444444444-44) || ($cpf == 555555555-55) || ($cpf == 666666666-66) ||
141
($cpf == 777777777-77) || ($cpf == 888888888-88) || ($cpf == 999999999-99)){ return(-2); // nmero invalido } $soma1 = ($cpf[0] * 10) + ($cpf[1] * 9) + ($cpf[2] * 8) + ($cpf[3] * 7) + ($cpf[4] * 6) + ($cpf[5] * 5) + ($cpf[6] * 4) + ($cpf[7] * 3) + ($cpf[8] * 2); $resto = $soma1 % 11; $digito1 = $resto < 2 ? 0 : 11 - $resto; $soma2 = ($cpf[0] * 11) + ($cpf[1] * 10) + ($cpf[2] * 9) + ($cpf[3] * 8) + ($cpf[4] * 7) + ($cpf[5] * 6) + ($cpf[6] * 5) + ($cpf[7] * 4) + ($cpf[8] * 3) + ($cpf[10] * 2); $resto = $soma2 % 11; $digito2 = $resto < 2 ? 0 : 11 - $resto;
if(($cpf[10] != $digito1) || ($cpf[11] != $digito2)){ return(true); // cpf vlido }else{ return(false); // cpf invlido } }
Exemplo
echo abs(-4.2); echo max(1, 3, 5, 6, 7); echo max(1, 3, 5, 6, 7); $c = pi() * $raio echo abs(-5); // 4.2 // 5 // 7 // 1
rand()
143
round()
echo round(3.4); echo round(3.5); echo round(3.6); echo round(1.95583, 2); echo round(5.045, 2);
echo round(1241757, -3); // 1242000 echo round(5.055, 2); echo sqrt(9); echo sqrt(10); echo sin(60);
Calcula o seno em graus echo sin(pi()); radianos Calcula o coseno em graus echo cos(pi()); radianos Calcula a tangente em graus echo tan(pi()); radianos
// 3.16227766 // -0.304810621 // -1 // 0
Fonte: o autor
ESTUDO DIRIGIDO
1. Qual a relao que existe entre uma funo e uma varivel? O nome de uma funo ocupa uma posio tal qual uma varivel, por isto ela poder guardar um valor aps ela ser encerrada. Este ser o valor retornado para o programa chamador. 2. Como se define o tipo de uma funo? Da mesma forma que em uma varivel, ou seja, como em PHP, a tipagem automtica, no necessrio especificar o tipo que ela retornar, isto acontecer automaticamente. 3. Quando uma funo no retorna valor, qual o tipo dela? Explicitamente, o tipo void, que significa vazio, porm no necessrio explicitar isto porque a tipagem automtica. 4. Como e quando uma funo retorna um valor? O valor retornado associado ao nome da funo como se fosse o nome de uma varivel. Esse valor pode ser associado em dois momentos: ao trmino da funo que, em geral, ocorre no fechamento do parnteses ou quando ela encontrar um return que pode estar em qualquer parte do cdigo. 5. Explique as duas formas de passagem de parmetros por referncia. A primeira feita com a declarao da varivel na lista formal de parmetros com o prefixo (operador modificador) &, indicando que na chamada da funo, ser passado o endereo (referncia) dela, e no o valor.
145
function soma(&$num1, $num2){ $num1 += 5; $num2 += 5; } // chamada da funo $a = 3; $b = 5; soma($a, $b); echo(a=$a, b=$b); // imprime a=8, b=5 A segunda forma trata de modicar essa denio indicando & no momento da chamada da funo. $a = 3; $b = 5; soma($a, &$b); echo(a=$a, b=$b); // imprime a=8, b=10 D exemplos de aplicaes que utilizam funes com parmetros predenidos. function ocina($ferramenta = martelo){ echo(A ferramenta um $ferramenta.); } ocina(serrote); // imprime A ferramenta um serrote.
SICA, Carlos. PHP Orientado a Objetos. Rio de Janeiro: Editora Cincia Moderna, 2006. ISBN: 8573935530. SICA, Carlos. PHP Com tudo. Rio de Janeiro: Editora Cincia Moderna, 2011. ISBN: 9788539900022. SICA, Carlos. Programao Segura utilizando PHP. Rio de Janeiro: Editora Cincia Moderna, 2007. ISBN: 9788573936087.
O Site ofi cial do PHP o <php.net>, ali voc vai encontrar tudo sobre PHP de todas as verses que j foram lanadas. No uma ferramenta de aprendizagem, mas um repositrio de consulta com muitos exemplos. Voc encontrar neste site um contedo estilo manual de utilizao e, para esta unidade, aprenda mais sobre funes da biblioteca PHP. <http://www.php.net/manual/en/language.functions.php>. O site da W3Schools oferece um conjunto de tutoriais, em muitos casos, voc poder at mesmo testar o cdigo-fonte que est aprendendo. um ambiente de autoaprendizagem que poder ajudar muito no seu curso. Nesta unidade, leia sobre algumas funes da biblioteca PHP no link indicado. <http://www.w3schools.com/php/php_functions.asp>. O site Wikipedia uma enciclopdia aberta, na qual todos podem escrever. Existem revisores, mas como ela trata de todos os assuntos de conhecimento, use o contedo com parcimnia, pois uma referncia ainda em construo. <http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_estruturada>. Este site tem uma apostila da PUC do Rio de Janeiro sobre funes. <http://www.inf.puc-rio.br/~inf1005/material/slides/intro_funcoes.pdf>. Este site em ingls tem vrios tutoriais para iniciantes, entre eles sobre funes. <http://www.mathsisfun.com/sets/function.html>.
COnSIdeRAeS FInAIS
Na unidade IV, ns estudamos a forma tcnica de resolver grandes problemas atacadando partes especficas dele. Dividir um grande problema em subproblemas uma tarefa difcil, mas muitssimo produtiva. Se conseguir fazer isto na sua vida toda, tudo ser mais simples e seus objetivos sero atingidos mais facilmente, poder inclusive contar com a participao de familiares e amigos, que podero executar pequenas tarefas para te ajudar.
147
O trabalho em equipe, no qual cada um faz a sua parte, sempre vencedor. A computao tenta de todas as formas imitar a vida, e a programao em mdulos apenas mais uma das tentativas desta imitao, e neste caso deu certo. Aproveite!
Um mdulo pode ser defi nido como um grupo de comandos, constituindo um trecho de algoritmo, com uma funo bem defi nida e o mais independente possvel em relao ao resto do algoritmo. A maneira mais intuitiva de proceder modularizao defi nir um mdulo principal de controle e mdulo especfi co para as funes do algoritmo. O ideal que os mdulos no sejam grandes demais, pois seno acabam sendo multifuncionais e de difcil compreenso, de modo que o mdulo deve ser implementado apenas as estruturas de dados necessrios para atingir ao objectivo do mdulo (PROGRAMAO MODULAR, in: Wikipedia, online).
Programao estruturada uma forma de programao de computadores que preconiza que todos os programas possveis podem ser reduzidos a apenas trs estruturas: sequncia, deciso e interao, desenvolvida por Michael A. Jackson no seu livro Principles of Program Design de 1975. Tendo, na prtica, sido transformada na Programao modular, a Programao estruturada orienta os programadores para a criao de estruturas simples em seus programas, usando as subrotinas e as funes. Foi a forma dominante na criao de software anterior programao orientada por objetos (MODULARIDADE, in: Wikipedia, online).
AtIVIdAdeS de AutOeStudO
1. Faa um programa que utilize pelo menos uma funo para calcular a regra de trs estabelecida entre a unidade mtrica de produtos vendidos nos supermercados. Por exemplo, se uma lata de massa de tomate com 327 gramas custa R$ 2,70, quanto custaria um quilo deste produto? 2. Faa uma funo recursiva que calcule o Mnimo Mltiplo Comum (MMC) entre dois nmeros.
UNIDADE V
ARQUIVOS
Professor Me. Carlos Sica Objetivos de Aprendizagem Aprender o que so, para que servem e como manipular arquivos no servidor. Ser capaz de manipular arquivos-textos e binrios.
Plano de Estudo A seguir, apresentam-se os tpicos que voc estudar nesta unidade: Tipos de arquivos Escrita em arquivos Leitura em arquivos
INTRODUO
muito comum, no linguajar atual, falarmos de arquivos e pastas, que antigamente chamavam de diretrio, so sinnimos. Todo programa de computador (software) ou informao guardada em um computador ser gravada em uma unidade de memria (pendrive, HD, CD, DVD etc.) em arquivos. Cada programa ou conjunto de informaes forma um arquivo, e um conjunto desses arquivos forma uma pasta.
Concluindo, um arquivo apenas um nome dado para um conjunto de informaes gravadas no computador. Os arquivos podem guardar informaes no formato que conhecemos, chamados texto, ou ainda no formato binrio, que codifica as informaes diminuindo o tamanho fsico do arquivo.
Fonte: SHUTTERSTOCK.com
151
Alm disso, um arquivo pode estar no seu computador (local) ou pode estar em um servidor (remoto) que voc tenha acesso pela rede (Internet). Dados em arquivos Para manipular os arquivos que podem estar no seu computador ou em um servidor remoto, so necessrias quatro operaes bsicas que compem o conjunto mnimo para atuar sobre os arquivos: abertura, leitura, escrita e fechamento. Nosso objetivo estudar a manipulao de arquivos remotos, lembre-se de que o PHP roda no servidor, por isso, vamos realizar operaes sobre eles, e no sobre os arquivos que esto no nosso computador. Mas tudo que vamos aprender aqui serve para outras linguagens, inclusive aquelas que atuam no computador local. Uma vez que o arquivo esteja aberto, o sistema criar uma estrutura chamada stream que vai funcionar como uma forma de ligao entre o arquivo e o seu programa. sobre essa estrutura que sero aplicadas as operaes de leitura e/ou escrita. Ao final dessas operaes, o arquivo deve ser fechado. O fechamento do arquivo significa desassoci-lo da stream por meio de uma operao de fechamento. Em termos menos tcnicos, neste momento que ele ser salvo no computador.
Fonte: SHUTTERSTOCK.com
Os dados podem ser lidos e escritos sequencialmente, mas o acesso tambm pode ser aleatrio, por isto a stream mantm um indicador de posio para facilitar nosso trabalho. Abrir um arquivo implica em dispor esse indicador de posio bem no seu comeo. Quando um elemento lido ou escrito no arquivo, dependendo da operao, o indicador de posio incrementado, garantindo a progresso automtica ao longo do arquivo. Exemplo de um arquivo e seu respectivo indicador mostrado na figura abaixo.
T E X T O G R A V A D O N O A R Q U I V O EOF
Indicador de posio
Fonte: o autor
As trs letras no final, EOF, vm da frase em ingls End Of File, que traduzindo significa fim do arquivo. Trata-se de uma constante que representa o ltimo byte do arquivo, como o ponto final de um texto, no existe nada aps este sinal.
TIPOS DE ARQUIVOS
Arquivos-textos A maioria dos arquivos gravada no formato texto. Gravar dados em arquivos-textos significa que cada caractere contido no dado original ser convertido em um cdigo de oito bits, chamado ASCII e gravado sequencialmente no arquivo conforme j foi ilustrado na figura anterior.
153
Arquivos binrios Existem sistemas operacionais que diferenciam arquivos gravados no modo texto ou no modo binrio. O armazenamento e a interpretao de tipos de dados variam entre os processadores, sistemas operacionais e compiladores/interpretadores diferentes.
Lembre-se de que os tipos que estudamos so: Inteiro, Real (Ponto fl utuante), caracteres (char), Cadeias ou sequncias de caracteres (String), Cadeias, sequncias ou arranjos de dados (array) e Objeto (somente para a programao orientada a objetos).
Frequentemente, um caractere ocupa 1 byte, mas quando se trata de tipos mais complexos como um inteiro, sua representao pode ser feita por 2 bytes em mquinas mais antigas ou 4 bytes quando armazenados em outro tipo de sistema.
Fonte: SHUTTERSTOCK.COM
Para facilitar o aprendizado, vamos esmiuar os arquivos binrios em um item aps entendermos bem os arquivos de uma forma geral, pois as 4 operaes j citadas (abertura, leitura, escrita e fechamento) so base para trabalhar com os 2 tipos de arquivos.
Em um arquivo, podemos gravar qualquer tipo de dado. Em aplicaes pequenas, podemos utilizar arquivos em vez de banco de dados.
Fonte: SHUTTERSTOCK.COM
155
Explicando: A varivel $nomearq do tipo cadeia de caracteres (string) e deve receber um nome vlido de arquivo. Definir o nome do arquivo uma ao de partida e sempre ser feita no incio do script, e tome sempre o cuidado de especificar o nome completo, incluindo caminho de pesquisa nas pastas onde o arquivo estiver gravado.
Eu recomendo que, para lembrana futura, se voc deseja manipular um arquivo que est no mesmo local do script, apesar de no ser obrigatrio, utilize o ponto para indicar isto.
$nomearq = ./nomearq.txt;
Assim voc nunca esquecer que foi sua inteno trabalhar com um arquivo na mesma raiz do script. A string contida na varivel $modo determina como o arquivo ser aberto, indicando o tipo do arquivo e o tipo da operao. A tabela, abaixo, mostra todas as constantes do modo de abertura do arquivo, bem como suas combinaes. Modo r Nome Read Significado Abre um arquivo-texto para leitura. Abre ou cria (caso no exista) um arquivo-texto para escrita. CUIDADO: neste modo, todos os dados anteriores sero perdidos. Abre ou cria (caso no exista) um arquivo-texto para escrita. Neste modo de escrita, os dados enviados para escrita sero anexados ao final do arquivo mantendo os dados anteriores. Abre um arquivo binrio para leitura. Abre ou cria (caso no exista) um arquivo binrio para escrita. CUIDADO: neste modo, todos os dados anteriores sero perdidos.
Write
Append
rb
Read binary
wb
Write binary
157
ab
Append binary Read Write Read Write Read Append Read binary Write binary Read binary Write binary Read binary Append binary
Abre ou cria (caso no exista) um arquivo binrio para escrita. Neste modo de escrita, os dados enviados para escrita sero anexados ao final do arquivo, mantendo os dados anteriores. Abre um arquivo-texto para leitura e escrita. CUIDADO: neste modo, todos os dados anteriores sero perdidos. Abre ou cria (caso no exista) um arquivo-texto para leitura e escrita. CUIDADO: neste modo, todos os dados anteriores sero perdidos. Abre ou cria (caso no exista) um arquivo-texto para leitura e escrita. Neste modo de escrita os dados enviados para escrita sero anexados ao final do arquivo mantendo os dados anteriores. Abre um arquivo binrio para leitura e escrita. CUIDADO: neste modo, todos os dados anteriores sero perdidos. Abre ou cria (caso no exista) um arquivo binrio para leitura e escrita. CUIDADO: Neste modo, todos os dados anteriores sero perdidos. Abre ou cria (caso no exista) um arquivo binrio para leitura e escrita. Neste modo de escrita, os dados enviados para escrita sero anexados ao final do arquivo, mantendo os dados anteriores.
r+
w+
a+
rb+
wb+
ab+
Fonte: o autor
Como voc pode ver, existem duas formas de abrir um arquivo para escrita. quando o modo w for escolhido, signifi ca que tudo que estiver na stream vai ser transferido para o arquivo como um todo e os dados anteriores sero substitudos sem que um backup seja feito. J no modo a, que signifi ca anexar, o contedo da stream ser escrito no fi nal do contedo j existente, mantendo os dados existentes.
Exemplo: Para abrir um arquivo chamado teste.txt, no qual faremos operaes de escrita, vamos utilizar o modo w. Isto , se ele no existir ser criado, se ele j existir, perderemos tudo que j foi armazenado anteriormente.
$ptrarq = fopen(teste.txt,w);
Embora tecnicamente correto, voc geralmente ver o cdigo anterior escrito de uma forma mais profissional.
$nomearq = ./teste.txt; $modo = rw; $ptrarq = fopen($nomearq, $modo); if(!$ptrarq){ exit(O arquivo no pode ser aberto.); }
A grande vantagem que este mtodo detectar erro na abertura de um arquivo, tal como um disco cheio, protegido contra gravao ou diretrio com atributos que probem a gravao. Procure sempre utilizar esse procedimento, pois, em geral, o bom programador deve se
159
precaver de qualquer tipo de imprevisto, e confirmar o sucesso das funes como a fopen() antes de tentar qualquer outra operao no arquivo bem profissional.
A funo fopen(), quando invocada utilizando o modo de escrita (w ou a), tambm serve para criar um arquivo quando ele no existe.
Fechamento do arquivo A funo fclose() fecha um arquivo aberto por meio de uma chamada a fopen(). A operao realizada a transferncia de tudo que est na stream para o arquivo e a consequente destruio dela. quando o script for encerrado, isto acontecer automaticamente, mas o programador no pode de forma alguma confiar nisto. Deve fechar todos os arquivos explicitamente. O fechamento de um arquivo essencial para garantir que os dados sejam preservados, pois se, por exemplo, a energia eltrica interrompida antes do fechamento de um arquivo, os dados sero perdidos. Exemplo: Vamos nos basear no exemplo anterior, onde o arquivo foi aberto e a varivel $ptrarq contm o apontador dele, que o nico parmetro que esta funo exige.
fclose($ptrarq);
No vamos confundir nunca fechamento de arquivo com destruio dele. Para isso, existe uma funo especfica.
Remoo de arquivos quando voc precisar apagar (deletar) um arquivo, o PHP tambm tem uma funo para isto. Para remover ou eliminar um arquivo existente, utilize a funo unlink().
unlink($nomearq);
Uma vez feito isto, no h volta, este arquivo no poder ser recuperado.
161
de fim de arquivo seja encontrada sem que o verdadeiro final fsico do arquivo tiver sido alcanado, devemos utilizar a funo feof(), que detecta com segurana quando o final de arquivo realmente for atingido. Esta funo retornar verdadeiro se o ponteiro estiver no fim do arquivo ou um erro ocorrer; caso contrrio, retornar falso. Adiantando um pouquinho o prximo item, o exemplo a seguir l apenas um caractere e verifica se o fim do arquivo. Para ler todos os caracteres, ser necessrio utilizar uma estrutura de repetio como no exemplo do prximo item. Exemplo: se no for fim de arquivo, leia o prximo caractere.
if (!feof()) { $caractere = fgetc(); }
Leitura em arquivos-textos Uma vez aberto o arquivo, ns podemos ler os dados contidos nele de vrias formas: caractere por caractere, linha por linha, ou ainda, todo o contedo de uma vez. Antes de continuar, quero promover um debate simples, mas importante, para quem trabalha com arquivos-textos utilizando PHP. Na internet, utilizamos os navegadores como nossa interface principal. So neles que vamos imprimir os resultados de um script PHP e isto inclui, por exemplo, a impresso de um arquivo-texto lido no HD do servidor. Para imprimir uma quebra de linha, o navegador precisa receber uma tag HTML responsvel por isto, por exemplo, <br>, ou ainda os delimitadores de pargrafo <p> e </p>. Acontece que, em geral, os arquivos-textos no so HTML, mas textos simples que utilizam
outra forma de simbolizar a quebra de linha. Existem 2 tipos de constantes que representam uma quebra de linha: a constante \r e a constante \n, que significam, respectivamente, retorno do cursor para o incio da linha e mudana do cursor para uma nova linha. Juntas elas formam o enter do teclado. Para piorar a vida do programador, alguns editores de texto utilizam apenas o \n para representar o fim de uma linha.
De agora em diante, lembre-se que \r\n representa o fi m de uma linha em arquivos-textos e que alguns arquivos podem ainda utilizar somente o \n.
Leitura de caracteres A funo fgetc() l individualmente os caracteres em um arquivo previamente aberto com o operador de modo r. Para tanto, basta passar como parmetro o ponteiro para o arquivo de origem.
$char = fgetc($ptrarq);
Esta funo retornar falso quando a constante de final do arquivo for encontrada. Exemplo: O cdigo abaixo serve para ler um arquivo no formato texto, caractere por caractere, e imprimi-lo no navegador. Lembre-se que o navegador utiliza a tag <br> para iniciar uma nova linha enquanto os arquivos-texto utilizam as constantes \r\n. O processo de leitura de um caractere repetido at que a marca de final de arquivo seja lida.
163
$nomearq = ./teste.txt; $modo = r; $ptrarq = fopen($nomearq, $modo); if(!$ptrarq){ exit(O arquivo no pode ser aberto.); } while (($char = fgetc($ptrarq)) !== false){ if($char == \n) echo(<br>); // navegador no entende \n else echo($char); } fclose($ptrarq);
Isto muito til quando voc precisa testar cada caractere para encontrar um especfico.
Os operadores de comparao !== e === implicam em examinar os valores comparados para saber se so ou no idnticos em valor e tipo de dado.
A funo fgetc() compatvel com os dados binrios, portanto, pode retornar um valor booleano falso, mas tambm pode retornar valores no booleanos que podem ser avaliados como falsos, por exemplo, um inteiro ou um real com valor igual a zero. Um char, uma string vazia, ou ainda um ponteiro nulo, tambm podem ser confundidos com o zero booleano (falso). Para garantir o resultado da comparao, deve-se utilizar o operador idntico (===) ou o
operador no idntico (!==) para testar o valor retornado. Leitura de linhas A funo fgets(), l uma string em um arquivo-texto aberto previamente. Esta string uma linha terminada pelas constantes \r\n. Ela exige como parmetros o ponteiro para o arquivo de origem ($ptrarq) e o comprimento (em bytes) do arquivo ou o nmero de bytes a serem lidos dentro do arquivo a partir do indicador de posio.
$strlida = fgets($ptrarq,$comprimento);
Como as strings guardam um byte para marcar seu final, ela sempre retornar uma string com o comprimento especificado menos um byte ($comprimento 1). Caso venha a ocorrer algum tipo de erro, ela retornar falso. Esta funo encerrar a leitura quando: (comprimento 1) bytes foram lidos; encontrar um fim de linha (\r\n) (que includo no valor retornado); ou encontrar o fim de arquivo (EOF).
Se o segundo parmetro for omitido, portanto, nenhum comprimento for informado, o default ser 1024 bytes (1Kb). Exemplo: Como ler um arquivo completo linha aps linha e imprimi-lo na tela do navegador. Neste exemplo, utilizamos a funo str_replace(), que substitui uma string por outra especificada.
165
$nomearq = ./teste.txt; $modo = r; $ptrarq = fopen($nomearq, $modo); if(!$ptrarq){ exit(O arquivo no pode ser aberto.); } while(!feof($ptrarq)){ $linha = fgets($ptrarq); echo(str_replace(\r\n,<br>,$linha)); echo(str_replace(\n,<br>,$linha)); } fclose($ptrarq);
A funo str_replace() encontra a string especificada no primeiro parmetro e a substitui pelo segundo parmetro, quantas vezes for encontrada na string analisada. Este exemplo troca a quebra de linha determinada por \r\n ou \n pelo delimitador HTML <br>, que compreendido por todos os navegadores. Leitura por lote A funo fread() l em um arquivo a quantidade de bytes especificada no parmetro $comprimento, a partir do indicador de posio do arquivo informado em $ptrarq.
$conteudo = fread ($ptrarq, $comprimento);
A leitura interrompida quando: o nmero de bytes especificado foi lido; ou o fim do arquivo (EOF) foi alcanado; ou quando um pacote se torna disponvel (para streams de rede).
Vamos utilizar a funo PHP filesize() para determinar o tamanho do arquivo aberto.
$nomearq = ./teste.txt; $modo = rb; $ptrarq = fopen($nomearq, $modo); if(!$ptrarq){ exit(O arquivo no pode ser aberto.); } $conteudo = fread($ptrarq, filesize($nomearq)); echo(str_replace(\r\n,<br>,$conteudo)); echo(str_replace(\n,<br>,$conteudo)); fclose ($ptrarq);
A funo filesize(), retorna o tamanho do arquivo em bytes a partir do seu nome, que deve ser formado pelo caminho completo. Para utilizar essa funo em sistemas que diferenciam os arquivos tipo binrio e os tipo texto, necessrio abrir o arquivo com a constante b (referente a binrio) includa como parmetro na funo fopen(). Leitura no formato array A funo PHP file() l um arquivo inteiro e o atribui a um array, indexando cada linha do arquivo lido. Cada posio ou elemento do array corresponde a uma linha no arquivo, incluindo o(s) caractere(s) de nova linha. Por herana de outras linguagens, diferentemente das outras funes, ela espera receber o nome do arquivo e no seu ponteiro. Exemplo: Como ler um arquivo completo e imprimi-lo na tela do navegador.
167
Esta funo utiliza o nome do arquivo, por isto no necessria a abertura dele com a funo fopen().
A funo print_r() imprime o contedo de qualquer array, neste caso, o que contm as linhas do arquivo lido. O resultado na tela do navegador ser semelhante a isto: Array ( [0] => contedo da linha 1 [1] => contedo da linha 2 [2] => contedo da linha 3 ) Para obter uma visualizao melhor, podemos preparar a apresentao com uma formatao HMTL cujas tags so <pre> e </pre> e significa que o navegador receber tudo que estiver dentro destas tags com uma preformatao HTML.
$nomearq = ./teste.txt; $conteudo = file($nomearq); echo(<pre>); print_r($conteudo); echo(</pre>);
Escrita em arquivos-textos Existem duas formas de gravar os dados presentes em uma stream em um arquivo existente: substituindo o contedo (w); e anexando novas linhas ou caracteres ao seu final (a).
Porm, se o arquivo novo, o efeito ser semelhante. Escrita em arquivo novo Para criar um novo arquivo, devemos utilizar o modo de escrita w, que proporciona a operao de criao, caso ela no exista. Porm, necessrio cautela, pois caso o arquivo exista, o seu contedo ser substitudo pelo novo sem a criao de uma cpia de reserva (backup).
fwrite($ptrarq, $string, $comprimento)
As funes fwrite() e fputs() so sinnimas. Elas gravam os contedos informados na varivel parmetro $string no arquivo apontado pela varivel $ptrarq segundo o critrio descrito no primeiro pargrafo. Se o $comprimento for dado, a gravao ir parar depois que: o nmero de bytes correspondentes for escrito; ou
169
o fim da string for alcanado; o que ocorrer primeiro. Exemplo: Como escrever um texto completo em um arquivo novo.
$nomearq = ./teste.txt; $linha = linha 1\r\n; $linha .= linha 2\r\n; $linha .= linha 3\r\n; $ptrarq = fopen($nomearq,w); fwrite($ptrarq,$linha); fclose($ptrarq);
Como existe o perigo de perdermos o contedo de um arquivo existente, vamos novamente ser profissionais e tomar o cuidado de verificar se o arquivo j existe, por isto, vamos utilizar a funo file_exists().
$nomearq = ./teste.txt; if(!file_exists($nomearq)){ $linha = linha 1\r\n; $linha .= linha 2\r\n; $linha .= linha 3\r\n; $ptrarq = fopen($nomearq,w); fwrite($ptrarq,$linha); fclose($ptrarq); }
A funo file_exists() retorna verdadeiro ou falso em relao consulta pelo nome do arquivo. Portanto, a ideia deste exemplo : caso o arquivo no exista, deve ser aberto com o modo w para que o mesmo seja criado.
Escrita em arquivo existente Se um arquivo j existe, possvel escrever adendos no final dele. Para tanto, como j vimos antes, utilize o modo de abertura a para anexar dados sem perder os existentes. Exemplo: novos dados gravados em adio s linhas j existentes, sem perder os anteriores.
$nomearq = ./teste.txt; $linha = uma linha a mais\r\n; $ptrarq = fopen($nomearq,a); fwrite($ptrarq,$linha); fclose($ptrarq);
Escrita em arquivos novos e existentes Para garantir a integridade de arquivos existentes, sabemos que devemos utilizar o operador de modo a para anexar dados sem perder os anteriores. Vamos agora apresentar um exemplo completo que se preocupa com os dois casos: arquivo existente ou no.
$nomearq = ./teste.txt; if(!file_exists($nomearq)){ $linha = linha 1\r\n; $linha .= linha 2\r\n; $linha .= linha 3\r\n; $ptrarq = fopen($nomearq,w); fputs($ptrarq,$linha); fclose($ptrarq); }else{ $linha = uma linha a mais\r\n; $ptrarq = fopen($nomearq,a); fputs($ptrarq,$linha);
171
fclose($ptrarq); }
Acesso aleatrio a arquivos At agora estudamos as formas possveis de se ler os dados de um arquivo de forma sequencial, deixando que o indicador de posio fosse incrementando automaticamente pelas funes de leitura de um caractere, string ou contedo total. As operaes de leitura e escrita aleatrias podem ser executadas utilizando o sistema de stream com a ajuda da funo fseek(), que modifica o indicador de posio de arquivo de acordo com a necessidade do programa.
fseek($ptrarq, $numbytes, $origem);
Os parmetros so: $ptrarq um ponteiro de arquivo devolvido por uma chamada de fopen() e $numbytes, um nmero inteiro que o nmero de bytes contados a partir de $origem do arquivo. A varivel $origem deve ser uma das constantes listadas na tabela abaixo, que contm todas as constantes de posicionamento do cursor virtual (indicador de posio) dentro dos arquivos. Origem Incio do arquivo Posio atual Final do arquivo
Fonte: o autor
Portanto, para mover n bytes a partir do incio do arquivo, a origem deve ser SEEK_SET. Para mover a partir da posio atual, deve-se utilizar SEEK_CUR e para mover a partir do final do arquivo, deve-se utilizar SEEK_END, neste ltimo caso, o nmero de bytes deve ser negativo, pois est retornando do fim para o incio do arquivo.
Diferente da maioria das funes, fseek() retorna 0 (zero) como resultado, quando bem-sucedida, e -1 (um negativo) caso contrrio. Para os exemplos a seguir, suponha o arquivo-texto mostrado na tabela a seguir em detalhes. linha 1 linha 2 linha 3
Fonte: o autor
0 l 9 l 18 l
1 i 10 i 19 i
2 n 11 n 20 n
3 h 12 h 21 h
4 a 13 a 22 a
5 14 23
6 1 15 2 24 3
7 \r 16 \r 25 \r
8 \n 17 \n 26 \n 27 EOF
Resultado:
linha 1 linha 3
173
Reiniciando o cursor A funo rewind() reposiciona o indicador de posio do arquivo no incio do arquivo em uso. Isto , de forma semelhante a uma fita de vdeo, ela rebobina o arquivo. Exemplo:
$nomearq = ./teste.txt; $modo = rb; $ptrarq = fopen($nomearq, $modo); if(!$ptrarq){ exit(O arquivo no pode ser aberto.); } // l o arquivo todo $dados = fread($ptrarq, filesize($nomearq)); // imprime tudo echo($dados.<br>); // tenta ler, mas o indicador est no final $dados = fgets($ptrarq); // no imprime contedo mas pula uma linha, $dados = null echo($dados.<br>); // reposiciona o indicador no incio rewind($ptrarq); // l a primeira linha $dados = fgets($ptrarq); // imprime a linha lida echo($dados.<br>);
Resultado:
linha 1 linha 2 linha 3 linha 1
Encontrando a posio do cursor A funo ftell(), retorna como resultado a localizao do indicador de posio do arquivo aps a ltima operao de leitura ou escrita. Exemplo: ler todos os caracteres de um arquivo e indicar qual a posio que ele foi lido.
$nomearq = ./teste.txt; $modo = rb; $ptrarq = fopen($nomearq, $modo); if(!$ptrarq){ exit(O arquivo no pode ser aberto.); } while(!feof($ptrarq)){ echo(Posio: .ftell($ptrarq).: ); $char = fgetc($ptrarq); if($char == \n) echo(\\n <br>); elseif($char == \r) echo(\\r <br>); else echo($char.<br>); } fclose($ptrarq);
Resultado:
Posio 0: l Posio 1: i Posio 2: n Posio 3: h Posio 4: a Posio 5: Posio 6: 1 Posio 7: \r
175
Posio 8: \n Posio 9: l Posio 10: i Posio 11: n Posio 12: h Posio 13: a Posio 14: Posio 15: 2 Posio 16: \r Posio 17: \n Posio 18: l Posio 19: i Posio 20: n Posio 21: h Posio 22: a Posio 23: Posio 24: 3 Posio 25: \r Posio 26: \n Posio 27:
endian e little endian, que so utilizados para definir a organizao dos bytes que compem o nmero armazenado na memria de forma independente da mquina utilizada. O byte mais esquerda considerado pela matemtica computacional o menos significativo, e o da direita, por sua vez, o mais significativo. Por exemplo, o nmero 1.512.165.217 pode ser representado como 5A 21 CF 61 em hexadecimal ou pode ainda ser representado em binrio organizado, como mostra a figura abaixo. Organizao de um nmero inteiro quando dividido em bytes:
Byte mais significativo Byte menos significativo
231 230 229 228 227 226 225 224 223 222 221 220 219 218 217 216 215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 0 0 1 2 3 22 21 20 23 22 21 20 23 22 21 20 23 22 21 20 23 22 21 20 23 22 21 20 23 22 21 20 23 22 21 20
5 A 2 1 C F 6 1
Fonte: o autor
No sistema big endian, a parte mais significativa do nmero armazenada no endereo mais baixo da memria, e no little endian, a parte mais significativa do nmero vai para o endereo mais alto da memria. Quando este nmero armazenado na memria, pode seguir pelo menos dois padres, como mostra a tabela abaixo que exemplifica a organizao de um nmero inteiro de 4 bytes ou 32 bits quando armazenado na memria do computador.
Endereo 00 01 02 03 Fonte: o autor Big Endian 00000000 00000101 01000100 00111111 Parte menos significativa no endereo mais alto. Parte mais significativa no endereo mais baixo. Little Endian 00111111 01000100 00000101 00000000 Parte mais significativa no endereo mais alto. Parte menos significativa no endereo mais baixo.
177
A maioria dos computadores modernos, como os PCs, utilizam a organizao little endian.
A funo pack() deve ento receber um cdigo para indicar qual o tipo de dado que ser
utilizado para representar o dado no arquivo. A tabela apresentada mais frente organiza os diversos tipos de dados utilizados universalmente. Para recuperar o valor original, a biblioteca PHP oferece a funo unpack(), que devolve um array contendo o valor desempacotado da string recebida. Exemplo:
$nomearq = ./teste.bin; $ptrarq = fopen($nomearq, rb); $valorBin = fread($ptrarq, filesize($nomearq)); $valor = unpack(L,$valorBin); print_r($valor); fclose($ptrarq);
A seguir, apresentada uma tabela com a formatao de dados em arquivos binrios. A primeira coluna mostra o cdigo a ser utilizado como parmetro da funo pack(), a segunda explica qual tipo de dado est relacionado ao cdigo e, por fim, a terceira, o tipo de dado no formato original, como conhecido internacionalmente. Cdigo a A h H Descrio Tipo
Strings separadas por caracteres NUL-padded string NULL Strings separadas por caracteres SPACE-padded string espao Strings hexadecimal cujo nibble menos Hex string, low nibble first significativo vem em primeiro lugar Strings hexadecimal cujo nibble mais Hex string, high nibble first significativo vem em primeiro lugar
179
c C
Inteiro curto com sinal (-32.768 a +-32.767) com tamanho de 2 bytes (16 signed short (always 16 bit, machine bits) que seguem a ordem definida pela byte order) mquina Inteiro curto sem sinal (0 a 65535) unsigned short (always 16 bit, machine com tamanho de 2 bytes (16 bits) que byte order) seguem a ordem definida pela mquina Inteiro curto sem sinal (0 a 65535) com tamanho de 2 bytes (16 bits) unsigned short (always 16 bit, big que seguem a ordem big endian de endian byte order) armazenamento Inteiro curto sem sinal (0 a 65535) com tamanho de 2 bytes (16 bits) que unsigned short (always 16 bit, little seguem a ordem little endian de endian byte order) armazenamento Inteiro com sinal com tamanho e ordem signed integer (machine dependent dos bytes dependente da mquina size and byte order)
Inteiro sem sinal com tamanho e ordem unsigned integer (machine dependent dos bytes dependente da mquina size and byte order) Inteiro longo com sinal (-2147483648 a +2147483647) com tamanho de 4 bytes signed long (always 32 bit, machine (32 bits) que seguem a ordem definida byte order) pela mquina
Inteiro longo sem sinal (0 a 4.294.967.295) com tamanho de 4 unsigned long (always 32 bit, machine bytes (32 bits) que seguem a ordem da byte order) mquina Inteiro longo sem sinal (0 a 4.294.967.295) com tamanho de 4 unsigned long (always 32 bit, big bytes (32 bits) que seguem a ordem endian byte order) big endian de armazenamento Inteiro longo sem sinal (0 a 4.294.967.295) com tamanho de 4 unsigned long (always 32 bit, little bytes (32 bits) que seguem a ordem endian byte order) little endian de armazenamento Real com ponto flutuante (float) float (machine dependent size and com tamanho e ordem dos bytes representation) dependente da mquina Real duplo com ponto flutuante (double) double (machine dependent size and com tamanho e ordem dos bytes representation) dependente da mquina Byte NULO 1 byte NULL byte Back up one byte
x X @
Preenchido com NULO para uma NULL-fill to absolute position posio absoluta
Fonte: o autor
Exemplo: O script abaixo exemplifica como gravar mais de um valor inteiro em arquivos binrios e tambm como recuper-los do arquivo. Nesta primeira parte, estamos explicando como salvar dois nmeros em um arquivo binrio.
181
So eles os valores inteiros 123 e 456, que sero empacotados no formato inteiro longo, conforme a tabela acima mostrou.
$nomearq = ./teste.bin; $valor = 123; $ptrarq = fopen($nomearq, wb); $valorBin = pack(L,$valor); echo(Primeiro valor ($valor) empacotado e gravado com ); echo(fwrite($ptrarq, $valorBin). bytes<br>); echo(Separador de valores: quebra de linha); echo(fwrite($ptrarq, \r\n). bytes<br>); $valor = 456; $valorBin = pack(L,$valor); echo(Segundo valor ($valor) empacotado e gravado com ); echo(fwrite($ptrarq, $valorBin). bytes<br>); fclose($ptrarq);
Resultado: O primeiro valor (123) foi empacotado e gravado com 4 bytes, porque especificamos o parmetro L para a funo pack(). Separador de valores gravados como quebra de linha utilizando 2 bytes. Segundo valor (456) empacotado e gravado com 4 bytes. Exemplo: O script abaixo recupera os valores salvos.
$ptrarq = fopen($nomearq, rb); $valorBin = file($nomearq,filesize($nomearq)); echo(<br>Valores lidos e desempacotados:<br>); foreach($valorBin as $valor){ $valor = unpack(L,$valor);
Como resultado, os valores lidos e desempacotados em arrays diferentes que podem ser atribudos para variveis comuns se necessrio. Array ( [1] => 123 ) Array ( [1] => 456 ) O contedo final do arquivo ser composto por uma sequncia de bytes conforme segue: 78 00 00 00 0D \r 0A \n C8 01 00 00
0000007816 = 12310
Fonte: o autor
000001C816 = 45610
Esta tcnica de salvar dados em arquivos binrios tem vrios objetivos: Salvar tipos de dados comuns e especiais como estruturas de dados e objetos. Salvar informaes que necessitaro de decodificao para o entendimento como senhas.
183
ESTUDO DIRIGIDO 1. Elabore um script para salvar dados de clientes compostos por nome, endereo e telefone. Os dados de cada cliente devem ficar em linhas independentes e cada dado deve ser separado por um ponto e vrgula. Linha 1: nome; endereo; telefone Linha 2: nome; endereo; telefone
// Script intitulado: grava_arquivo.php $nomearq = ./teste.txt; // monta uma linha com os dados de um cliente $linha = $_GET[nome].;.$_GET[endereco].;.$_GET[telefone]; // decide se vai gravar em um arquivo novo ou anexar em um existente if(!file_exists($nomearq)){ $ptrarq = fopen($nomearq,w); }else{ $ptrarq = fopen($nomearq,a); } // escreve a linha montada fputs($ptrarq,$linha); // fecha o arquivo fclose($ptrarq);
2. Elabore um script para ler os dados dos clientes registrados no arquivo do exerccio anterior e imprima na tela em forma de ficha. Nome: Carlos Toledo Endereo: Avenida Guedner, 156
Telefone: 1234-5678
// Script intitulado: le_arquivo.php $nomearq = ./teste.txt; $ptrarq = fopen($nomearq, r); if(!$ptrarq){ exit(O arquivo no pode ser aberto.); } while(!feof($ptrarq)){ $linha = fgets($ptrarq); $linha_array = explode($linha); echo(Nome: .$linha_array[0].<br>); echo(Endereo: .$linha_array[1].<br>); echo(telefone: .$linha_array[2].<br>); echo(<br>); } fclose($ptrarq);
CONSIDERAES FINAIS
Trabalhar bem com arquivos representa um grande poder na computao e poucos profissionais se dedicam a tal tarefa. Mas voc deve ter percebido que no basta aprender como se grava dados e como voc os l do arquivo. preciso dominar os tipos de dados e as formas que eles podem ser gravados. Voc percebeu que mesmo quando estamos gravando no formato texto, existem vrias formas de gravar os dados. A sua deciso deve ser inteligente, e com a prtica vai ver que possvel resolver quase tudo com arquivos. Mas quando quiser uma soluo diferente, utilize banco de dados, assunto que vamos aprender no prximo livro. At l!
185
SICA, Carlos. PHP Orientado a Objetos. Rio de Janeiro: Editora Cincia Moderna, 2006. ISBN: 8573935530. SICA, Carlos. PHP Com tudo. Rio de Janeiro: Editora Cincia Moderna, 2011. ISBN: 9788539900022. SICA, Carlos. Programao Segura utilizando PHP. Rio de Janeiro: Editora Cincia Moderna, 2007. ISBN: 9788573936087.
O Site ofi cial do PHP o <php.net>, ali voc vai encontrar tudo sobre PHP de todas as verses que j foram lanadas. No uma ferramenta de aprendizagem, mas um repositrio de consulta com muitos exemplos. Voc encontrar neste site um contedo estilo manual de utilizao. Este link te leva para funes que operam sobre o sistema de arquivos no servidor, portanto, tome muito cuidado para no causar nenhum dano ao sistema. <http://www.php.net/manual/en/ref.fi lesystem.php>.
CONCLUSO
Eu escrevi este livro especialmente para o curso de Sistemas para Internet para o Ensino a Distncia do CESUMAR (EAD-CESUMAR) e espero realmente que ele tenha sido til para formar um programador de PHP motivado para desenvolver excelentes sistemas computacionais para a Internet. Na Unidade I, ensinei como fazer uma pgina pessoal para a Internet utilizando a linguagem de apresentao HTML. Mas pense um pouco sobre isto, voc aprendeu como construir formulrios inteligentes e bonitos para compor a ferramenta de entrada dos seus scripts PHP. Com esse contedo, voc capaz de trabalhar no setor de desenvolvimento para grandes empresas ou para voc mesmo, caso deseje ser um empresrio. Na Unidade II comeamos com a linguagem PHP, como se estivssemos aprendendo juntos. Eu procurei passar os conceitos bem devagar para que voc navegasse em guas tranquilas, absorvendo cada conceito como se eles fossem muito fceis ou, s vezes, como se voc j os conhecesse. A Unidade III, um pouco mais frente em contedo, te ensinou a programar de verdade de forma estruturada. Voc aprendeu a utilizar as estruturas de programao conhecidas mundialmente, em todas as linguagens conceituadas no meio acadmico e no meio empresarial. Da comparao repetio, passo a passo, voc consegue agora criar suas prprias solues computacionais. Na Unidade IV eu escrevi para voc uma tcnica muito utilizada, a programao modular. Com ela voc consegue escrever programas cujos mdulos podem ser reaproveitados em qualquer outro programa. Uma funo bem escrita serve para a vida toda e voc pode agora criar uma biblioteca particular de funes, como aquela que j existe no servidor PHP, mas toda sua, uma biblioteca que s voc tem. Para finalizar este livro, eu te ensinei como guardar dados em arquivos do tipo texto e do tipo binrio. Mais uma ferramenta poderosa. Com arquivos voc pode armazenar dados para a vida toda. De fichas cadastrais a dados meteorolgicos e cientficos, tudo pode ser guardado em arquivos. Utilize esta ferramenta sem medo e sem medida, aproveite bem este conhecimento que voc adquiriu e saia na frente dos seus concorrentes.
187
Durante todo este curso, tentei te ensinar as boas tcnicas de programao, mas tive o grande objetivo de dar a voc um diferencial em relao aos outros programadores. Aproveite bem!
<td align=rigth>Nome:</td>
<td align=rigth>Endereço:</td>
<td align=rigth>telefone:</td>
<td align=center colpsan=2><input type = submit value=Enviar></td> </tr> </table> </form> </html> </body> PROGRAMAO I (PHP) | Educao a Distncia
189
RESULTADO:
case 20: echo Se \$valor contiver um nmero entre 17 e 20 vai entrar aqui.; break; default: echo \$valor contm um nmero fora da faixa requerida.; }
UNIDADE IV 1.
function peso($peso, $valor){ $total = ($valor * 1000) / $peso; return($total); } $peso = peso($_GET[peso], $_GET[valor ], $_GET[unidade ]); echo(O valor de 1Kg $peso);
2.
function mmc($x,$y){ } $resultado = mmc($_GET[x], $_GET[y ]; echo(O mmc de .$_GET[x]. e . $_GET[y ]. . $resultado) return (($x*$y)/(mdc($x,$y)));
191
REFERNCIAS
DALLOGLIO , Pablo. PHP Programando Com Orientao a Objetos. So Paulo: Editora Novatec, 2009. ISBN: 9788575222003. GUTMANS, Andi; BAKKEN, Stig S.; RETHANS, Derick. PHP 5 Power Programming. Indianapolis: Prentice Hall, 2004. SICA, Carlos. PHP Orientado a Objetos. Rio de Janeiro: Editora Cincia Moderna, 2006. ISBN: 8573935530. SICA, Carlos. Programao Segura Utilizando PHP. Rio de Janeiro: Editora Cincia Moderna, 2007. ISBN: 9788573936087. SICA, Carlos. PHP Com Tudo. Rio de Janeiro: Editora Cincia Moderna, 2011. ISBN: 9788539900022. SOARES, Rafael. PHP Para Iniciantes. Rio de Janeiro: Editora Cincia Moderna, 2012. ISBN: 9788539902392. XAVIER, Fabrcio S. V. PHP: do Bsico Orientao de Objetos. Rio de Janeiro: Editora Cincia Moderna, 2008. ISBN: 9788573936841. Webopedia. What Is Big-Endian? Disponvel em: <http://www.webopedia.com/TERM/B/ big_endian.html>. Acesso em: 05 abr. 2013. Wikipedia. Funo. Disponvel em: <http://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o>. Acesso em: 05 abr. 2013. Wikipedia. Definio Recursiva. Disponvel em: <http://pt.wikipedia.org/wiki/
Defini%C3%A7%C3%A3o_recursiva>. Acesso em: 05 abr. 2013. Wikipedia. Programao Estruturada. Disponvel em: <http://pt.wikipedia.org/wiki/ Programa%C3%A7%C3%A3o_estruturada>. Acesso em: 05 abr. 2013. WIKIPEDIA. Programao Modular. Disponvel em: <http://pt.wikipedia.org/wiki/
193