Novatec
Captulo 1
Reviso de PHP
Este um livro que aborda tpicos avanados da linguagem PHP (www.php.net). Porm, para voc que teve pouco ou nenhum contato com essa linguagem, este captulo ser de grande importncia, visto que contm uma reviso de PHP, apresentando sua sintaxe bsica e ensinando a utilizar constantes, variveis, operadores e estruturas de controle (como if, switch, while e for). Alm disso, ser mostrado como realizar operaes sobre um banco de dados MySQL, que um sistema bastante utilizado com o PHP. Se voc um programador mais experiente, pode passar diretamente ao captulo 2.
Iniciando em PHP
Um programa PHP pode ser escrito em qualquer editor de texto, como, por exemplo, o Bloco de Notas (Notepad), do Windows, ou o Vi, do Linux. J existem tambm diversos editores especficos para o PHP, que exibem cada elemento (variveis, textos, palavras reservadas etc.) com cores diferentes, para melhorar a visualizao. Um trecho de cdigo PHP deve estar entre as tags <?php e ?>, para que o servidor web possa reconhecer que se trata de um cdigo de programao e possa chamar o interpretador PHP para execut-lo. Para comear a treinar, abra o editor de texto de sua preferncia e digite as linhas a seguir:
<?php // legal, estou escrevendo meu primeiro programa em PHP echo "<h1 align='center'>Este meu primeiro programa!</h1>"; ?>
Salve esse programa como prog1.php e envie-o para o diretrio que voc est utilizando para hospedar o site. Esse programa vai gerar como resultado a frase "Este meu primeiro programa!" centralizada na pgina, conforme mostrado na figura
23
24
1.1. Para ver o resultado, basta voc acessar pelo navegador (browser) o endereo http://<seu_endereo>/prog1.php, onde voc deve substituir <seu_endereo> pelo endereo do servidor que est utilizando para executar os programas PHP.
A seguir apresentado o significado de cada uma das linhas que voc digitou no programa prog1.php:
Elemento
<?php //
echo ?>
Descrio Indica o incio de um trecho de cdigo PHP. Representa uma linha de comentrio. Tudo que vem aps essas barras na mesma linha ignorado pelo PHP. Os comentrios so muito teis para uma boa documentao de seu programa. As duas barras servem para transformar uma nica linha em comentrio, mas voc pode usar /* para iniciar uma seqncia de comentrios e, depois, finalizar os comentrios com */. Trata-se de um dos comandos mais utilizados em PHP. Serve para escrever algo na tela. Indica o trmino de um trecho de cdigo PHP.
Se voc escolher a opo Exibir-Cdigo-fonte em seu navegador, ver o cdigo que seu browser recebeu, que foi o seguinte:
<h1 align='center'>Este meu primeiro programa!</h1>
Note que o navegador no recebe nenhuma linha em PHP, somente o cdigo HTML puro. Isso acontece porque o PHP roda no servidor, que processa todos os trechos de programao e retorna somente o resultado final para o navegador.
25
Em relao velocidade de processamento, podemos fazer uma pequena comparao entre o PHP e a linguagem ASP (Active Server Pages), da Microsoft. Mesmo que as pginas .php demorem um pouco mais para ser processadas que as pginas com HTML puro, diversos testes realizados por programadores americanos comprovaram que so processadas muito mais rpido do que aquelas que usam programao ASP. Alm disso, o PHP possui um gerenciamento de memria superior ao do ASP.
26
Note a combinao existente entre as tags HTML e o cdigo PHP. No incio do programa, atribumos a data atual varivel $data_de_hoje, utilizando o comando date. Essa varivel estar disponvel para uso em qualquer parte da pgina. Depois utilizamos HTML para escrever a frase "Hoje dia" e completamos abrindo um novo trecho de PHP, escrevendo a data atual armazenada na varivel $data_de_hoje por meio do comando echo.
Salve esse programa como prog3.php e veja o resultado em seu navegador. Perceba que no h nenhum comando echo no programa, por isso seu navegador mostrar uma tela em branco. Os valores atribudos s variveis ficaram armazenados apenas na memria, mas no foram mostrados na tela. Ao visualizar o cdigo-fonte recebido pelo navegador, voc ver apenas as tags do HTML:
<html> <body> </body> </html>
Vejamos agora um exemplo parecido com o anterior, mas dessa vez vamos utilizar o comando echo para mostrar informaes na tela. Digite o seguinte programa em
27
Abrindo essa pgina em seu navegador, voc obter o resultado exibido na figura 1.2.
Com esses exemplos voc descobriu duas informaes fundamentais: 1. A importncia do comando echo: para gerar dados dinmicos fundamental dominar esse comando ou algum outro que produza sada na tela. 2. A interpolao de variveis: daqui em diante voc vai usar muito essa tcnica. Trata-se da incluso do valor de uma varivel dentro da outra, como, por exemplo, em nosso programa prog4.php, na varivel chamada $frase, inclumos o valor da varivel $pais. Ou seja, dentro da string que atribuda a uma varivel, podemos colocar outra varivel e, no momento do processamento do programa, o PHP ir substituir a varivel por seu valor. Como veremos no tpico Variveis, importante lembrar que em PHP as variveis comeam sempre pelo smbolo de cifro ($).
Constantes
28
So valores que so predefinidos no incio do programa e que no mudam ao longo de sua execuo. Voc pode definir suas prprias constantes utilizando o comando define. Leve em considerao que, por padro, o PHP diferencia letras maisculas de minsculas. O nome da constante deve ser referenciado no programa exatamente do mesmo modo que voc a definiu. A sintaxe do comando define a seguinte:
bool define (string nome, misto valor [, bool case_insensitive])
Onde nome o nome que voc vai utilizar para representar a constante, valor um valor qualquer (numrico ou alfanumrico) a ser atribudo a ela e case_insensitive um valor lgico (true ou false) que indica se o PHP deve diferenciar letras maisculas de minsculas quando houver uma referncia a essa constante. Veja o exemplo a seguir, nomeado como prog5.php, que mostra como devemos usar as constantes: prog5.php
<html> <body> <?php define ("meunome","Juliano Niederauer"); define ("peso",78); echo "O meu nome " . meunome; echo "<br>"; echo "O meu peso " . peso . " quilos"; ?> </body> </html>
Note que, no exemplo que acabamos de ver, referenciamos as constantes diretamente pelo nome que escolhemos, e no utilizamos na frente delas o smbolo $, pois esse smbolo utilizado apenas para representar variveis. Outro recurso que utilizamos neste exemplo foi a concatenao, representada pelo ponto (.). Podemos concatenar quantos dados quisermos, e todos eles sero exibidos como apenas uma seqncia de caracteres. Alm de voc poder definir suas prprias constantes, o PHP j possui diversas constantes predefinidas. A tabela a seguir mostra algumas delas:
Constante
TRUE FALSE
29
E_WARNING E_NOTICE
Contm o nome do script que est sendo executado. Contm o nmero da linha do script que est sendo executado. Contm a verso corrente do PHP. Nome do sistema operacional no qual o PHP est rodando. Exibe um erro ocorrido em um script. A execuo interrompida. Exibe uma mensagem de aviso do PHP. A execuo no pra. Exibe um erro de sintaxe. A execuo interrompida. Mostra que ocorreu algo, no necessariamente um erro. A execuo no pra.
Variveis
As variveis servem para armazenar dados que podem ser usados em qualquer ponto do programa. Cada varivel est associada a uma posio de memria de seu computador. Ao contrrio de linguagens tradicionais, como C, Pascal e Delphi, no PHP no necessrio declarar variveis. Basta atribuir diretamente um valor a estas e, a partir desse momento, j estaro criadas e associadas a um tipo (numrico, alfanumrico etc.), dependendo do valor que lhes foi atribudo. Vimos que em PHP as variveis devem iniciar com o smbolo $. Aps esse smbolo, deve vir o identificador da varivel, ou seja, o nome pelo qual ser referenciada durante a execuo do programa. Esse identificador no pode iniciar com um nmero. Os nmeros podem aparecer em qualquer posio do identificador, menos na primeira. Exemplos de variveis vlidas e invlidas: Vlidas
$nota1 $casal20 $bisc8 $gremio_2_vezes_campeao_america
Invlidas
$100vergonha $5 $20assustar $60nacadeira
recomendvel que voc utilize sempre identificadores com letras minsculas, pois o PHP faz a distino entre maisculas e minsculas. Se voc misturar os dois
30
tipos de letras, poder confundir-se ao utilizar as variveis, j que $nota_aluno no a mesma coisa que $Nota_aluno. Imagine se um aluno tirou nota 10 e esse valor foi armazenado na varivel $nota_ aluno. Na hora de imprimir a nota do aluno, voc digitar a seguinte linha:
<?php echo $Nota_aluno; ?>
O aluno ser reprovado, pois voc imprimiu a varivel errada. Portanto, tome cuidado: o PHP distingue letras maisculas de minsculas para nomes de variveis.
31
Isso ocorreu porque no incio da funo testa_escopo1 se indicou que a varivel era a mesma utilizada globalmente. Desse modo, todas as alteraes feitas na varivel $num dentro da funo, alteraram o valor que existia nessa varivel global. Se retirssemos da funo a declarao global, a varivel $num no seria reconhecida.
$num
Veja que a varivel $autor foi criada dinamicamente. Primeiro o valor autor foi atribudo varivel $futuro_identificador e, depois, com o uso de $$, o valor autor tornou-se o identificador da varivel recm-criada. A varivel criada $autor recebeu o valor da varivel $nome e, em seguida, seu contedo foi mostrado na tela aps a frase "O nome do autor ". Guarde bem esse conceito de variveis com nomes dinmicos, pois existiro situaes em que esse recurso poder ser a nica soluo para resolver um problema.
Arrays
As variveis comuns (tambm chamadas de variveis escalares) podem armazenar apenas um valor por vez. Um array (vetor) pode armazenar vrios valores ao mesmo tempo, pois trata-se de uma estrutura de armazenamento que, assim como as variveis, possui um identificador, mas alm disso h um ndice associado (que pode
32
ser um nmero ou um texto), e cada ndice indica uma posio de memria em que fica armazenado um elemento do array. O ndice deve aparecer entre colchetes ([ ]), logo aps o identificador do array. Vamos ver um exemplo para voc entender melhor o conceito de array: na entrada de um edifcio, h um daqueles armrios com diversas gavetas para guardar correspondncias, uma para cada apartamento. Podemos comparar o armrio com o array, e os apartamentos com os ndices do array. Ou seja, existe apenas um nome identificador, que o armrio, mas, se um morador do edifcio chega para pegar suas correspondncias, ele deve acessar a gaveta correspondente a seu ndice, que o nmero de seu apartamento. Os arrays so muito teis quando precisamos realizar automatizao de tarefas em nossos programas. Imagine que os nomes de todos os moradores de um edifcio devem ser mostrados na tela. Obviamente no seria vivel que utilizssemos variveis escalares para armazenar os nomes. Se fossem 60 nomes, teramos 60 variveis, e para mostrar os valores na tela, deveramos usar 60 vezes o comando echo. Mas se os nomes dos 60 moradores estivessem guardados em um array, bastaria que utilizssemos um comando de repetio (que veremos mais adiante) para imprimir desde a primeira posio do array at a ltima, ou seja, variando o ndice de 0 a 59. Veja a seguir alguns exemplos de armazenamento em arrays:
$vetor[0] = 30; $vetor[1] = 40; $vetor[5] = 50; $vetor[15] = 60;
Se no colocarmos o ndice do vetor entre colchetes, o PHP ir procurar o ltimo ndice utilizado e increment-lo, armazenando assim o valor na posio seguinte do array, conforme mostra o exemplo a seguir:
$vet[ ] = "Grmio"; $vet[ ] = "Campeo";
Nesse exemplo teremos o valor Grmio armazenado em $vet[0] e o valor Campeo armazenado em $vet[1]. At agora s vimos exemplos em que o ndice do array um valor numrico, mas o ndice tambm pode ser um texto, e nesses casos o texto chamado de chave associativa:
$vetor["time"] = "Grmio"; $vetor["titulo"] = "Tetracampeo da Copa do Brasil"; $vetor["ano"] = 2001;
33
Repare que cada posio do array pode ser de um tipo diferente. Os valores das posies referenciadas por time e ttulo so do tipo string, mas o valor da posio referenciada por ano numrico. Outra situao que pode ocorrer o array possuir ndices numricos e strings ao mesmo tempo. No h problema algum em usar os dois tipos de ndices no mesmo array. Existem tambm as matrizes, que so arrays multidimensionais. Essas estruturas de armazenamento tambm contm um nico identificador, mas possuem dois ou mais ndices para referenciar uma posio de memria. Imagine que queremos armazenar na memria os nomes dos melhores clubes do futebol brasileiro, separando-os por estados e cidades. Podemos fazer isso utilizando um array bidimensional, como mostra o exemplo a seguir:
$clube ["RS"] ["PortoAlegre"] = "Grmio"; $clube ["RS"] ["Caxias"] = "Juventude"; $clube ["RS"] ["BentoGoncalves"] = "Esportivo"; $clube ["MG"] ["BeloHorizonte"] = "Atltico"; $clube ["MG"] ["NovaLima"] = "Vila Nova"; $clube ["MG"] ["Ipatinga"] = "Ipatinga"; $clube ["SP"] ["SaoPaulo"] = "Corinthians"; $clube ["SP"] ["Americana"] = "Rio Branco";
Esse exemplo mostra um array bidimensional, mas podemos usar arrays com mais de duas dimenses, bastando acrescentar mais colchetes com seus respectivos ndices. Outra forma de criar um array por meio da funo array do PHP. Veja o exemplo prog8.php, apresentado a seguir: prog8.php
<?php $vetor = array (10,50,100,150,200); echo $vetor[2] . "<br>"; $vet = array (1, 2, 3, "nome"=>"Joaquim"); echo $vet[0] . "<br>"; echo $vet["nome"]; ?>
Lembre-se de que o array iniciado na posio 0 (zero), por isso, apesar de ser o terceiro elemento do array, o 100 foi o primeiro valor mostrado, pois seu ndice 2. Depois se criou um array que possui ndices numricos e tambm uma chave
34
associativa. Com o uso do comando posies desse array.
echo,
Objetos
Tambm possvel programar em PHP com o modelo orientado a objetos. Podemos definir uma classe e, dentro dela, as variveis e funes que estaro disponveis a seus objetos. Um objeto a varivel que utilizamos para instanciar uma classe. Se voc alguma vez j estudou programao orientada a objetos, esse conceito deve lhe ser familiar. Veja um pequeno exemplo: prog9.php
<?php class teste { function Saudacao() { echo "Oi pessoal!"; } } $objeto = new teste; // $objeto se torna uma estncia da classe teste $objeto -> Saudacao(); ?>
Ao criar uma instncia da classe na varivel $objeto, podemos acessar as funes definidas dentro da classe. Esse programa mostrar a mensagem "Oi pessoal!". Uma das principais novidades do PHP 5 o novo modelo de orientao a objetos. A partir dessa verso, o PHP passa a operar com a Zend Engine 2.0. Para obter mais informaes, consulte o Apndice B deste livro, que apresenta as principais novidades desse novo modelo.
Operadores
Como o prprio nome indica, os operadores informam ao PHP quais operaes devem ser executadas com os valores recebidos, como, por exemplo, atribuir um valor a uma varivel, realizar operaes aritmticas (soma, subtrao etc.), realizar comparao de valores, testar se um maior ou menor que o outro etc. Veremos os seguintes tipos de operadores: aritmticos, binrios, de comparao, de atribuio, e ternrio.
35
Aritmticos
Utilizando esses operadores, voc poder efetuar qualquer operao matemtica com dados do tipo numrico, como, por exemplo, somar, subtrair, multiplicar, dividir etc. Confira a tabela com os operadores aritmticos do PHP:
Operador
+ * / %
O PHP possui tambm outros operadores aritmticos que atuam em apenas um operando. Esses operadores so bastante teis, pois nos permitem realizar de forma simples operaes, como troca de sinal, incremento ou decremento de valor etc. Se voc j programou em linguagem C, deve lembrar-se do incremento utilizando o operador ++. No PHP tambm possvel utiliz-lo. Vamos conhecer todos esses operadores com a tabela a seguir:
Operador -oper
++oper --oper oper++ oper--
Descrio Troca o sinal do operando. Pr-incremento. Primeiro incrementa o valor do operando e depois realiza a operao. Pr-decremento. Primeiro decrementa o valor do operando e depois realiza a operao. Ps-incremento. Primeiro realiza a operao e depois incrementa o operando. Ps-decremento. Primeiro realiza a operao e depois decrementa o operando.
Os operadores apresentados nessa tabela tambm so conhecidos como operadores unrios, pois necessitam apenas de um operando, ao contrrio da adio, subtrao e outras operaes que necessitam de pelo menos dois operandos. Por exemplo, se o objetivo for somente incrementar o valor de uma varivel, pode-se simplesmente digitar o nome da varivel seguida do operador ++. Exemplo:
$contador++;
Na verdade, esses operadores que acabamos de ver deixam seu programa muito mais simples em PHP, pois com o uso deles voc pode fazer em apenas uma linha
36
de cdigo o que faria em duas ou mais linhas se no os usasse. Ao entender como funcionam, seus cdigos ficaro mais simples e claros.
Binrios
Esses operadores atuam em um nvel de abstrao bem mais baixo: trabalham diretamente com bits. Podem ser utilizados para fazer comparaes binrias (bit a bit), inverter os bits de um operando, deslocar bits para direita (cada deslocamento para a direita equivale a uma diviso por 2) ou esquerda (cada deslocamento para a esquerda equivale a multiplicar o nmero por 2). Em alguns casos interessante usar os operadores binrios. Veja a tabela a seguir para conhec-los:
Operador
~op1 op1 & op2 op1 | op2 op1 ^ op2 op1 >> n op1 << n
Descrio Inverte os bits de op1. Operao E (AND) bit a bit. Operao OU (OR) bit a bit. Operao OU exclusivo (XOR). Desloca op1 n bits direita. Desloca op1 n bits esquerda.
No exemplo apresentado, o valor 50 (que equivale a 110010 na base binria) deslocado um bit direita, o que equivale a dividi-lo por 2. O resultado escrito na tela ser a diviso de 50 por 2, que d 25 (equivalente na base binria a 11001). Perceba que o nmero que vem aps o operando >> representa o nmero de bits que o operando ser deslocado para a direita. Portanto, se tivermos o nmero 2, o nmero ser dividido por 4 (duas divises sucessivas por 2). Se aps o operador >> houver um nmero n, estaremos dividindo o operando por 2n.
Comparao
37
Tambm chamados de condicionais. So aqueles que executam comparaes entre o valor de duas variveis, ou de uma varivel e um texto, ou uma varivel e um nmero. Com eles podemos testar, por exemplo, se uma varivel possui um valor maior que o da outra ou se possui um valor maior que o de um determinado nmero, ou se o retorno dado pela chamada de uma funo verdadeiro ou falso. Veja a tabela a seguir:
Operador
op1 == op2 op1 === op2 op1 >= op2 op1 <= op2 op1 != op2 op1 !== op2 op1 <> op2 op1 > op2 op1 < op2
Descrio Verdadeiro se op1 for igual a op2. Verdadeiro se op1 for igual a op2 e se ambos forem do mesmo tipo. Verdadeiro se op1 for maior que ou igual a op2. Verdadeiro se op1 for menor que ou igual a op2. Verdadeiro se op1 for diferente de op2. Verdadeiro se op1 for diferente de op2 ou se ambos no forem do mesmo tipo. Tambm serve para representar diferena. Verdadeiro se op1 for maior que op2. Verdadeiro se op1 for menor que op2.
O operador de comparao == pode ser usado tanto na comparao de nmeros como na comparao de textos, ao contrrio de outras linguagens, que utilizam comandos especficos para comparar dados alfanumricos.
Atribuio
Atribuio o termo utilizado para representar a colocao de um valor em uma varivel. A varivel que receber a atribuio encontra-se sempre do lado esquerdo do operador, e esta recebe o valor gerado pela expresso ou operador que est direita. Alm disso, temos diversas variaes dos comandos de atribuio que podemos utilizar para facilitar a programao. So operadores que, assim como os operadores de incremento (++) e decremento (--), servem para deixar o cdigo mais simples e mais fcil de ser programado. Veja a seguir a tabela dos comandos de atribuio:
Operador
op1 = op2 op1 += op2 op1 -= op2 op1 *= op2 op1 /= op2 op1 .= op2
Descrio op1 recebe o valor de op2. Equivale a op1=op1+op2. Equivale a op1=op1-op2. Equivale a op1=op1*op2. Equivale a op1=op1/op2. Concatenao: equivale a op1=op1.op2.
38
op1 %= op2 op1 <<= op2 op1 &= op2 op1 |= op2 op1 ^= op2
PHP para quem conhece PHP Equivale a op1=op1%op2. Equivale a op1=op1<<op2. Equivale a op1=op1>>op2. Equivale a op1=op1&op2. Equivale a op1=op1|op2. Equivale a op1=op1^op2.
Muitas vezes programas podem apresentar problemas em razo da troca do operador de comparao == pelo operador de atribuio =. O programa acaba gerando resultado incorreto, pois se quisermos fazer uma comparao, por exemplo, entre as variveis $a e $b, deveremos usar a expresso $a==$b, e no $a=$b.
// $soma fica com 10 // $soma fica com 10+20 = 30 // $soma fica com 30*30 = 900 // $soma fica com 900%100 = 0
Como voc pode ver pelos comentrios do programa, o valor que ser mostrado na tela zero. O ltimo operador utilizado (%=) representa o resto da diviso (em outras linguagens chamado de MOD). Dividindo 900 por 100 temos como resultado exato 9, portanto o resto da diviso zero. No exemplo anterior, utilizamos os operadores +=, *= e %= para atribuir varivel $soma resultados de operaes realizadas entre a prpria varivel $soma e outro operando. Perceba que o cdigo fica bem mais claro e fcil de entender com o uso desses operadores de atribuio.
Lgicos
So aqueles que retornam o valor verdadeiro ou falso. Veja a tabela:
Operador
!op1 op1 AND op2
Descrio Verdadeiro se op1 for falso. Verdadeiro se op1 E op2 forem verdadeiros.
39
Verdadeiro se op1 OU op2 forem verdadeiros. Verdadeiro se s op1 ou s op2 for verdadeiro. Verdadeiro se op1 E op2 forem verdadeiros. Verdadeiro se op1 OU op2 forem verdadeiros.
Depois de observar essa tabela, voc provavelmente est com dvidas quanto diferena entre os operadores AND e &&, e tambm os operadores OR e ||. A diferena entre eles a precedncia dos operadores na avaliao de expresses. A precedncia mais alta dos operadores && e ||, enquanto os operadores AND e OR possuem precedncia mais baixa. Por isso, tome muito cuidado ao us-los, pois podem gerar resultados diferentes, dependendo da ordem em que forem colocados. Veremos mais diante um tpico especial sobre precedncia de operadores. Um exemplo tpico no qual usamos operadores lgicos o caso de testar se todos os campos obrigatrios de um formulrio foram preenchidos. Suponha termos um formulrio em que os campos nome, e-mail e CPF so obrigatrios. Certamente no programa que recebe os dados do formulrio haver um teste, como o mostrado no trecho de programa a seguir:
<?php ... if (empty($nome) OR empty($email) OR empty($cpf)) { echo "Voc deve preencher os campos nome, e-mail e CPF!"; exit; } ... ?>
Nesse exemplo, temos uma expresso sendo avaliada. A funo empty(), que significa vazio em portugus, retorna verdadeiro se a varivel estiver vazia e falso se houver algo na varivel. Ento, estamos testando se a varivel $nome est vazia ou a varivel $email ou a varivel $cpf est vazia. Se pelo menos uma das trs estiver vazia, o resultado ser verdadeiro, e isso far que seja impressa a mensagem Voc deve preencher os campos nome, e-mail e CPF! e, logo aps o programa, ser encerrado por meio do comando exit. Acompanhe as tabelas a seguir para ver os resultados gerados em cada um dos operadores de acordo com o tipo de expresso avaliada:
40
V F F F V F F F F
Operador OR (OU)
Exp1 V V F F Exp2 V F V F Resultado V V V F
Operador ! (NOT)
Exp1 V F Resultado F V
Ternrio
uma forma abreviada de usar o comando condicional if, que veremos mais adiante. Uma condio avaliada e, caso seja verdadeira, atribui-se um valor varivel, e caso seja falsa, atribui-se um outro valor. A sintaxe a seguinte:
cond ? exp1 : exp2
Vamos ver um exemplo de uso desse operador, embora seja mais recomendado utilizar o comando condicional if, por ser mais simples. Observe:
$nota = ($frequencia >= 0.75) ? ($nota+2) : ($nota-2);
Quando o PHP executar a linha anterior, se a varivel $frequencia possuir um valor maior que ou igual a 0,75, a varivel $nota ser aumentada de duas unidades, caso
41
contrrio haver a diminuio de duas unidades. Escrevendo essa mesma operao por meio do comando if, temos o seguinte cdigo:
<?php if ($frequencia >= 0.75) $nota = $nota+2; else $nota = $nota-2; ?>
Utilizando o comando if, torna-se bem mais fcil entender qual o objetivo do cdigo, pois conseguimos distinguir perfeitamente qual a condio e quais operaes sero executadas aps a avaliao desta.
Precedncia de operadores
Para evitar erros de lgica em programas, fundamental que voc conhea a ordem utilizada pelo PHP para tratar os operadores. A tabela a seguir mostra a ordem decrescente de precedncia que o PHP segue ao encontrar diversos operadores no programa:
Operador
new [ ! ~ ++ -- (int) (float) (string) (array) (object) @ * / % + - . << >>
No-lgico, inverso de bits, incremento e decremento, converso de tipos e controle de erro. Multiplicao, diviso e resto da diviso. Adio, subtrao e concatenao. Deslocamentos binrios. Maior, menor, maior ou igual, menor ou igual. Igual e diferente. AND binrio. XOR binrio. OR binrio. AND lgico. OR lgico. Operador ternrio. Operadores de atribuio. Impresso.
42
AND XOR OR ,
PHP para quem conhece PHP AND lgico (de menor prioridade). XOR lgico (de menor prioridade). OR lgico (de menor prioridade). Vrgula.
importante lembrar que primeiro o PHP executar todas as operaes que estiverem entre parnteses. Se dentro dos parnteses houver diversas operaes, a precedncia de operadores ser usada para definir a ordem. Depois de resolver todas as operaes que aparecem entre parnteses, o PHP resolver o resto da expresso baseando-se na tabela anterior para determinar a ordem de avaliao dos operadores. Quando houver operadores de mesma prioridade em uma mesma expresso, e no existirem parnteses, o PHP resolver a expresso da esquerda para a direita. Observe o seguinte trecho de programa: prog12.php
<?php $num = 5; $resultado = 8 + 3 * 2 + ++$num; echo "$num<br>"; echo $resultado; ?>
Observe que o operador ++ tem prioridade mais alta que os operadores + e *, por isso a primeira operao realizada pelo PHP foi o incremento do valor da varivel $num. O segundo operador de maior prioridade no exemplo apresentado o de multiplicao, portanto a segunda operao realizada foi 3*2. Aps essas duas operaes, ficamos com a soma 8+6+6. Note que temos dois operadores iguais (de adio), portanto, como tm a mesma prioridade, a expresso avaliada da esquerda para a direita: 8+6 = 14. E depois 14+6 = 20, que foi o resultado mostrado na tela. Analisando esse exemplo, voc pode perceber a importncia da precedncia dos operadores. Muitas vezes o uso incorreto dessas informaes causa a exibio de resultados errados na sada dos programas.
43
So comandos comuns maioria das linguagens de programao, e o uso deles fundamental para realizar decises lgicas, testar se determinada expresso verdadeira e repetir um bloco de comandos por um certo nmero de vezes ou at que uma condio seja atingida. Veremos os seguintes comandos: Comandos condicionais: if e switch. Comandos de repetio: while, do...while, for e foreach. Vamos ver ento como utilizar cada um deles.
if
Comando que avalia uma expresso e, dependendo do resultado, executa-se um conjunto diferente de instrues. O comando if pode possuir como complemento o elseif e/ou o else. Observe a sintaxe do comando if:
If ( exp1 ) { bloco1 } elseif ( exp2 ) { bloco2 } else { bloco3 }
Podemos ler essa sintaxe da seguinte maneira: se exp1 for verdadeira, execute bloco1; seno, se exp2 for verdadeira, execute bloco2; seno execute bloco3. importante lembrar que apenas um dos blocos ser executado e, depois disso, a execuo continuar aps o comando if. Em portugus, if significa se e else, seno Dentro da construo do comando . if, podem aparecer diversos elseif, cada um avaliando uma expresso. Quando a expresso avaliada pelo comando if resultar em valor verdadeiro (True), ser executado o bloco de comandos definido logo a seguir, que aparece entre chaves ({}). Se no houver a delimitao do bloco por chaves, ser executada apenas a primeira linha aps o if. Aps executar esse bloco de comandos, a execuo do programa ser desviada para o fim do comando if, e as demais expresses (contidas no elseif e no else) no
44
sero avaliadas, pois o comando instrues para execuo.
if
Se a condio avaliada no comando if for falsa (False), o bloco de comandos seguinte no ser executado, e ser testada a expresso contida no primeiro elseif (se houver). Se todas as expresses avaliadas (do if e do elseif) forem falsas, o bloco de comandos executado ser aquele que vier aps o else. importante destacar que no obrigatrio o uso de elseif e else com o comando if. O if pode aparecer sozinho, simplesmente determinando se um bloco de instrues ser executado ou no. Por exemplo:
<?php if ($nota == 10) { echo "Parabns! <br>"; echo "Voc tirou a nota mxima!" } ?>
Nesse exemplo, se o valor da varivel $nota for igual a 10, ser mostrada na tela a seguinte mensagem:
Parabns! Voc tirou a nota mxima!
Se o valor da varivel $nota no for igual a 10, esse bloco de comandos simplesmente no ser executado, e a execuo do programa seguir normalmente. Poderamos acrescentar um else ao comando e imprimir outra mensagem caso o aluno no tirasse nota 10.
switch
O comando switch similar if, pois ambos avaliam o valor de uma expresso para escolher qual bloco de instrues deve ser executado. Em algumas ocasies, voc tem uma mesma varivel a ser testada com valores diferentes, e nesse caso interessante utilizar o switch, que trabalha basicamente com o operador de igualdade, enquanto o if trabalha com qualquer tipo de operador. Veja a sintaxe do comando switch:
switch (operador) { case valor1: <comandos> break; case valor2: <comandos>
45
Perceba que, aps cada bloco de comandos, se deve utilizar o break, para que o comando switch seja encerrado e a execuo continue aps ele. Se no utilizarmos o break, o PHP continuar a execuo dentro do switch, avaliando as demais expresses. Veja a seguir um exemplo de uso desse comando:
<?php switch ($numero) { case 's': echo "Voc escolheu a opo SIM"; break; case 'n': echo " Voc escolheu a opo NO "; break; default: echo " A opo digitada invlida"; break; } ?>
A opo default tem a mesma funo da opo else no comando if. Se todas as expresses anteriores retornarem falso, ser executado o bloco de comandos que aparecer aps o default. O uso do default no obrigatrio no comando switch.
while
Traduzindo para o portugus, while significa enquanto. O comando while composto por uma expresso e por um bloco de comandos. O comando avalia a expresso, e enquanto essa expresso retornar o valor verdadeiro, a execuo do bloco de comandos em questo ser repetida. Quando o valor retornado falso, encerra-se o lao de repetio (loop) e a execuo transferida para o fim do comando while. Assim como no comando if, devemos utilizar chaves como delimitadores sempre que o bloco possuir mais de uma instruo para executar. Veja a sintaxe do comando:
while (exp)
46
{ }
Devemos tomar cuidado para no colocar no comando while expresses que jamais se tornaro falsas, seno teremos um loop infinito, pois o PHP repetir para sempre o bloco de instrues. Veja a seguir um exemplo de utilizao do while: prog13.php
<?php $cont = 1; while ($cont < 100) { echo "O valor atual do contador $cont <br>"; $cont++; } ?>
Quando a varivel $cont atingir o valor 100, a expresso retornar o valor falso, pois 100 no menor que o prprio 100, e isso far que o loop seja encerrado.
do...while
A diferena entre o while e o do...while que o while avalia a expresso no incio do lao e o do...while avalia a expresso no final do lao. Portanto, utilizando do...while, o lao ser executado pelo menos uma vez, e utilizando somente while, o lao pode no ser executado, caso a expresso avaliada retorne falso na primeira avaliao. A sintaxe do comando a seguinte:
do { comandos } while (exp);
47
for
Utilizamos o comando for quando queremos executar um conjunto de instrues um dado nmero de vezes. um comando muito til que pode ser usado, por exemplo, para imprimir todos os elementos de um array ou todos os registros retornados de uma consulta a um banco de dados. A sintaxe do comando for a seguinte:
for ( inicializao; condio; operador ) { comandos }
Como inicializao, geralmente determinamos o valor inicial da varivel que controlar o loop. O parmetro de inicializao poder ser $cont=0. No segundo parmetro, devemos colocar a condio que deve ser atingida para que o lao continue. Se quisssemos executar o loop 20 vezes, o valor do parmetro de condio seria $cont<20. Quando essa condio retorna o valor falso, o loop encerrado. O ltimo parmetro geralmente usado para atualizar o valor da varivel de controle do loop, fazendo um incremento ou um decremento (por exemplo, $cont++). Ao final de cada interao do loop, o valor da varivel de controle atualizado automaticamente, dependendo do terceiro parmetro que voc definiu quando utilizou o comando for. Veja um exemplo de utilizao do comando: prog15.php
<?php for ($cont = 0; $cont < 10; $cont++) { echo "A varivel \$cont vale $cont"; echo "<br>"; } ?>
48
foreach
O comando foreach nos oferece uma maneira mais fcil de navegar entre os elementos de um array. Observe as duas sintaxes possveis:
foreach ($nome_array as $elemento) { comandos }
ou
foreach ($nome_array as $chave => $valor) { comandos }
A primeira forma vai do primeiro ao ltimo ndice do array definido na varivel $nome_array, e a cada interao o valor do elemento corrente do array atribudo varivel $elemento e o ponteiro interno do array avanado. Dessa forma, podemos trabalhar com todos os valores do array utilizando apenas a varivel $elemento. A segunda forma segue o mesmo critrio, mas com uma diferena: alm de o valor do elemento corrente do array ser atribudo varivel $elemento, a chave (ou ndice) do elemento atual atribudo varivel $chave. Acompanhe o exemplo a seguir: prog16.php
<?php $vetor = array (1, 2, 3, 4); foreach ($vetor as $v) { print "O valor atual do vetor $v. <br>"; } $a = array ( "um" => 1, "dois" => 2, "tres" => 3 ); foreach ($a as $chave => $valor) { print "\$a[$chave] => $valor.<br>"; } ?>
$vetor
e,
49
$a.
O segundo
foreach
desse exemplo
Parmetro
servidor usurio senha novo_link
Descrio Endereo do servidor no qual est localizado o banco de dados. Nome de usurio a ser utilizado para a abertura da conexo. Senha a ser utilizada para a abertura da conexo. Indica se deve ser aberto um novo link quando for feita mais de uma chamada a essa funo com os mesmos parmetros.
50
flags_cliente
PHP para quem conhece PHP Define algumas configuraes do cliente. Pode ser uma combinao das constantes MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE e MYSQL_CLIENT_INTERACTIVE.
Em caso de sucesso, essa funo retorna o identificador da conexo, que posteriormente ser passado como parmetro para a funo de fechamento desta. Em caso de falha, retorna FALSE. Para fazer, por exemplo, a conexo com um banco de dados chamado bdteste, que possui como nome de usurio juliano e como senha teste, podemos executar o seguinte comando:
$conexao = mysql_connect ("localhost", "juliano", "teste");
Se o banco de dados estiver localizado em um servidor diferente, bastar substituir localhost pelo nome ou endereo IP desse servidor. Aps abrir a conexo, o prximo passo selecionar, por meio do comando mysql_select_db, qual ser o banco de dados utilizado. Por exemplo:
mysql_select_db ("bdteste");
A partir da, j podemos realizar operaes sobre o banco de dados. A funo PHP responsvel por executar comandos SQL a mysql_query, que possui a seguinte sintaxe:
recurso mysql_query (string comando [, recurso id_conexo])
Parmetro
comando id_conexo
Descrio Comando SQL a ser executado. Pode ser usado caso exista mais de uma conexo aberta; deve conter o identificador da conexo na qual o comando deve ser executado.
No caso da execuo de comandos SELECT, a funo mysql_query ir retornar um conjunto de resultados (se houver). Existem vrias formas de obter os valores desses resultados, utilizando funes como mysql_result, mysql_fetch_row, mysql_fetch_assoc e mysql_fetch_array. Aps realizar todas as operaes necessrias, devemos encerrar a conexo com o banco de dados executando a funo mysql_close. Vamos ver rapidamente um exemplo de programa PHP que realiza todos os passos descritos nesse tpico. Antes de criar o programa, vamos criar uma tabela no MySQL, na qual ficaro armazenados os dados. Essa tabela, que ir armazenar informaes sobre livros, ser criada da seguinte forma no utilitrio mysql:
create table livros ( isbn varchar(13), titulo varchar(80) NOT NULL, autor varchar(80) NOT NULL, paginas smallint NOT NULL,
51
O programa PHP dever abrir uma conexo com o servidor MySQL, selecionar todos os nomes de livros e seus respectivos autores e, logo aps, exibir essas informaes na tela, uma em cada linha. Acompanhe, ento, o cdigo do programa prog17.php apresentado a seguir: prog17.php
<?php $servidor = "localhost"; $usuario = "juliano"; $senha = "12345"; $banco = "test"; $con = mysql_connect($servidor, $usuario, $senha); mysql_select_db ($banco); $res = mysql_query("SELECT titulo,autor FROM livros"); $num_linhas = mysql_num_rows($res); for ($i = 0; $i < $num_linhas; $i++) { $dados = mysql_fetch_row ($res); $titulo = $dados[0]; $autor = $dados[1]; echo "$titulo - $autor <br>"; } mysql_close($con); ?>
Veja que para percorrer o resultado com o comando for, utilizou-se antes a funo que retorna o nmero de linhas resultantes em uma consulta SQL. Ao executar esse programa no navegador, ser exibido, para cada um dos livros, seu ttulo e, ao lado, o nome do autor.
mysql_num_rows,
Importante: se sua verso do MySQL for 4.1 ou superior, para aproveitar todos seus recursos, voc dever usar os comandos da biblioteca mysqli (Improved MySQL). Por exemplo: em vez de mysql_connect, use a funo mysqli_connect; em vez de mysql_query, use a funo mysqli_query; e assim por diante. No site da Novatec Editora, o exemplo anterior est disponvel tambm na verso da biblioteca mysqli .