Você está na página 1de 63

PHP: Funes

Programao de Servidores Marx Gomes Van der Linden

Funes

Uma funo (ou subrotina, procedimento...) um pedao de cdigo reutilizvel. A funo definida apenas uma vez, e pode ser utilizada um nmero indefinido de vezes. Em PHP, no necessrio fazer declarao de funes. Uma funo definida com o uso da palavra function.
http://marx.vanderlinden.com.br/ 2

Exemplo

Definio:
function exibeMensagem(){ echo "Ol!"; }

Uso:

exibeMensagem();

http://marx.vanderlinden.com.br/

Argumentos

Uma funo pode receber argumentos (parmetros). Na definio da funo especifica-se um nome de varivel que ser associado a cada argumento, na ordem especificada.

http://marx.vanderlinden.com.br/

Exemplo
function exibeMensagem($nome, $cor){ echo "Ol, <span style=\"color: $cor\">$nome</span>!"; } exibeMensagem('Fulano de Tal', 'blue');

Sada:

Ol, <span style="color:blue">Fulano de Tal</span>!


http://marx.vanderlinden.com.br/ 5

Escopo de Variveis

As variveis definidas como parmetros tm escopo local, isto , s so vlidas dentro da funo, e no colidem com variveis definidas externamente. Por padro, uma funo no tem acesso a variveis definidas fora de seu escopo.

http://marx.vanderlinden.com.br/

Escopo de Variveis
$nome = 'Beltrano Segundo'; echo "Saudaes, $nome!<br>\n"; function exibeMensagem($nome){ echo "Ol $nome!<br>\n"; } exibeMensagem('Fulano de Tal'); echo "Saudaes, $nome!<br>\n";

http://marx.vanderlinden.com.br/

Escopo de Variveis

Saudaes, Beltrano Segundo!<br> Ol Fulano de Tal!<br> Saudaes, Beltrano Segundo!<br>

http://marx.vanderlinden.com.br/

Escopo de Variveis
$nome = 'Beltrano Segundo'; $mensagem = 'Boa tarde!'; function exibeMensagem($nome){ echo "Ol $nome!<br>\n"; echo "$mensagem<br>\n"; } exibeMensagem('Fulano de Tal');

http://marx.vanderlinden.com.br/

Escopo de Variveis
Sada:

Ol Fulano de Tal!<br> <br>

http://marx.vanderlinden.com.br/

10

Escopo de Variveis

Para usar uma varivel externa dentro de uma funo, deve-se declar-la como global.

$nome = 'Beltrano Segundo'; $mensagem = 'Boa tarde!'; function exibeMensagem($nome){ global $mensagem; echo "Ol $nome!<br>\n"; echo "$mensagem<br>\n"; } exibeMensagem('Fulano de Tal'); http://marx.vanderlinden.com.br/
11

Escopo de Variveis
Sada:

Ol Fulano de Tal!<br> Boa tarde!<br>

http://marx.vanderlinden.com.br/

12

Modificando valores de variveis

Quando um valor passado como um parmetro para uma funo, o interpretador PHP cria uma cpia desse valor no escopo interno da funo A modificao desse valor dentro da funo no interfere no valor original

http://marx.vanderlinden.com.br/

13

Modificando valores de variveis


function exibeMensagem($nome){ echo "Ol $nome!<br>\n"; $nome = 'Beltrano Segundo'; } $meunome = 'Fulano de Tal'; exibeMensagem($meunome); echo "Saudaes, $meunome!<br>\n";

http://marx.vanderlinden.com.br/

14

Modificando valores de variveis


Sada:

Ol Fulano de Tal!<br> Saudaes, Fulano de Tal!<br>

http://marx.vanderlinden.com.br/

15

Passando variveis por referncia

possvel especificar que um ou mais argumentos de uma funo devem ser passados por referncia. Quando o argumento passado por referncia, PHP no cria uma cpia da varivel; ambos os nomes passam a se referir ao mesmo valor na memria. Para especificar um argumento por referncia, basta prefix-lo por &
http://marx.vanderlinden.com.br/ 16

Passando variveis por referncia


function exibeMensagem(&$nome){ echo "Ol $nome!<br>\n"; $nome = 'Beltrano Segundo'; } $meunome = 'Fulano de Tal'; exibeMensagem($meunome); echo "Saudaes, $meunome!<br>\n"; Ol Fulano de Tal!<br> Saudaes, Beltrano Segundo!<br>
http://marx.vanderlinden.com.br/ 17

Retornando um valor

Uma funo pode retornar um valor expresso que a chamou. Para retornar um valor dentro da funo, basta usar a estrutura return. Ao se atingir a instruo return, a funo finaliza a execuo e retorna o valor ao programa principal. No necessrio fazer qualquer alterao no cabealho da funo, ou fazer qualquer especificao de tipo de dados. http://marx.vanderlinden.com.br/

18

Retornando um valor
function media3($a, $b, $c){ return ($a + $b +$c) / 3; } $x = media3(480,720,1080); echo "A mdia $x<br>\n"; A mdia 760<br>

http://marx.vanderlinden.com.br/

19

Retornando um valor com if


function intervalo($numero){ if($numero > 1000) { return ' maior que 1000'; } else { if($numero > 100) return 'est entre 100 e 1000'; } return ' menor que 100'; } foreach( array(12, 345, 6789) as $n ){ echo "$n ", intervalo($n), "<br>\n"; } http://marx.vanderlinden.com.br/

20

Retornando um valor com if

Sada:

12 menor que 100<br> 345 est entre 100 e 1000<br> 6789 maior que 1000<br>

http://marx.vanderlinden.com.br/

21

Retornando mais de um valor


A instruo return s retorna um valor. Para escrever uma funo que retorne dois ou mais valores, h dois mtodos: 1) Utilizar referncias 2) Retornar um array

http://marx.vanderlinden.com.br/

22

Retornando um array
function dados3($a, $b, $c){ $valor['somatorio'] = $a + $b + $c; $valor['media'] = $valor['somatorio'] / 3; $valor['modulo'] = sqrt($a*$a + $b*$b + $c*$c); return $valor; } $res echo echo echo = dados3(480, 720, 1080); "Mdulo: $res[modulo]<br>\n"; "Mdia: $res[media]<br>\n"; "Somatrio: http://marx.vanderlinden.com.br/ $res[somatorio]<br>\n";

23

Retornando um array

Sada:

Mdulo: 1383.90751136<br> Mdia: 760<br> Somatrio: 2280<br>

http://marx.vanderlinden.com.br/

24

Retornando para outra funo


function media3($a, $b, $c){ return ($a + $b +$c) / 3; } function dados3($a, $b, $c){ $valor['somatorio'] = $a + $b + $c; $valor['media'] = media3($a, $b, $c); $valor['modulo'] = sqrt($a*$a + $b*$b + $c*$c); return $valor; } $res = dados3(480, 720, 1080); http://marx.vanderlinden.com.br/ // (...)
25

Retornando um valor booleano

Uma funo pode retornar um valor de qualquer tipo, inclusive:


Nmeros inteiros e de ponto flutuante Strings Arrays Booleanos (true ou false)

Funes que retornam valores booleanos podem ser facilmente incorporadas a expresses e instrues de controle de fluxo (if, while, for ...)
http://marx.vanderlinden.com.br/ 26

Retornando um valor booleano


function positivoPar($n){ if($n < 0) return false; if($n % 2 == 0) return true; else return false; } echo "Nmeros positivos pares:\n<ul>\n"; foreach( array(-10,-3,2,5,6,7,11,12) as $x){ if(positivoPar($x)) echo " <li>$x</li>\n"; } echo "</ul>"; http://marx.vanderlinden.com.br/ 27

Retornando um valor booleano

Sada:

Nmeros positivos pares: <ul> <li>2</li> <li>6</li> <li>12</li> </ul>

http://marx.vanderlinden.com.br/

28

Recursividade

Uma funo pode chamar a si mesma. Esta caracterstica chamada recursividade e a maneira mais prtica de se solucionarem vrios problemas.

http://marx.vanderlinden.com.br/

29

Recursividade
function fatorial($n){ if ($n == 0 or $n== 1) return 1; else return $n * fatorial($n-1); } echo fatorial(5); 120
http://marx.vanderlinden.com.br/ 30

Funes dentro de funes

PHP permite que uma funo seja declarada dentro de outra funo. Todas as funes tm escopo global, mas funes internas s passam a existir quando a funo externa chamada.

http://marx.vanderlinden.com.br/

31

Funes dentro de funes


function primeira(){ echo "Primeira mensagem.<br>\n"; function segunda(){ echo "Segunda mensagem.<br>\n"; } } primeira(); echo ".. e agora ..<br>\n"; segunda();
http://marx.vanderlinden.com.br/ 32

Funes dentro de funes

Sada:

Primeira mensagem.<br> .. e agora ..<br> Segunda mensagem.<br>

http://marx.vanderlinden.com.br/

33

Argumentos Opcionais

possvel especificar que alguns argumentos so opcionais, atribuindo-lhes valores-padro.

Sempre ao final da lista!

http://marx.vanderlinden.com.br/

34

Argumentos Opcionais
function exibeMensagem($nome, $cor='black') { echo "Ol, <span style=\"color: $cor\">$nome</span>!"; } exibeMensagem('Fulano de Tal');

Sada:

Ol, <span style="color:black">Fulano de Tal</span>!


http://marx.vanderlinden.com.br/ 35

Argumentos Opcionais
function exibeMensagem($nome, $sobrenome, $cor='black', $nvisitas=0) { echo "Ol, <span style=\"color: $cor\">$nome $sobrenome</span>!<br>\n"; echo "Essa sua visita n. $nvisitas"; } exibeMensagem('Fulano', 'de Tal', 'red'); Ol, <span style="color:red">Fulano de Tal</span>!<br> Essa sua visita n. 0
http://marx.vanderlinden.com.br/

36

Nmero varivel de argumentos

possvel criar uma funo com nmero varivel de argumentos.

A mesma funo pode receber zero ou mais argumentos.

Nesse tipo de funo, no se especificam os argumentos por nome.

http://marx.vanderlinden.com.br/

37

Nmero varivel de argumentos

Utiliza-se:

func_num_args() Obtm o nmero de argumentos func_get_arg($n) Obtm um argumento especfico func_get_args() Obtm um array contendo todos os argumentos

http://marx.vanderlinden.com.br/

38

func_num_args()
function nvar(){ echo "Essa funo tem ", func_num_args(), " argumentos.<br>\n"; } nvar(); nvar(480,720,1080); nvar('a', 'b', 'c', 'd'); Essa funo tem 0 argumentos.<br> Essa funo tem 3 argumentos.<br> Essa funo tem 4 argumentos.<br>
http://marx.vanderlinden.com.br/ 39

func_get_arg($n)
function nvar(){ $numargs = func_num_args(); echo "<h4>Essa funo tem $numargs argumentos.</h4>\n"; if($numargs >= 3) echo "Terceiro: ", func_get_arg(2), "<br>\n"; if($numargs >= 4) echo "Quarto: ", func_get_arg(3), "<br>\n"; } nvar(); nvar(480,720,1080); http://marx.vanderlinden.com.br/ nvar('a', 'b', 'c', 'd');
40

func_get_arg($n) - Sada

http://marx.vanderlinden.com.br/

41

func_get_args()
function media(){ $total = 0; foreach( func_get_args() as $arg ){ $total += $arg; } return $total / func_num_args(); } echo media(320, 480, 720, 1080); 650
http://marx.vanderlinden.com.br/ 42

Funes variveis

possvel armazenar o nome de uma funo em uma varivel, e usar essa varivel para chamar a funo correspondente. Conceito semelhante aos ponteiros para funes de C.

http://marx.vanderlinden.com.br/

43

Funes variveis
function mensagem() { echo "Ol!<br>\n"; } function saudacao(){ echo "Bom dia!<br>\n"; } $acao = 'mensagem'; $acao(); $acao = 'saudacao'; $acao(); Ol!<br> Bom dia!<br>

http://marx.vanderlinden.com.br/

44

Funes variveis
function soma2($a, $b) { return $a + b; } function multi2($a, $b) { return $a * $b; } function exp2($a, $b){ return pow($a, $b);} function operacao($tipo, $a, $b){ switch($tipo){ case 'soma': return soma2($a,$b); case 'multi': return multi2($a,$b); case 'exp': return exp2($a,$b); } } http://marx.vanderlinden.com.br/

45

Funes variveis
function soma2($a, $b) { return $a + b; } function multi2($a, $b) { return $a * $b; } function exp2($a, $b){ return pow($a, $b);} function operacao($tipo, $a, $b){ $func = $tipo . 2; return $func($a,$b); } echo operacao('multi', 3, 4); 12
http://marx.vanderlinden.com.br/ 46

Incluindo arquivos

Em qualquer projeto no-trivial, comum que se tenha um grande conjunto de funes que vai ser utilizado em diferentes lugares do cdigo. Nesses casos, recomendvel agrupar as funes em arquivos especificos e incluir esses arquivos em todas as pginas do site em que se faam necessrio.

http://marx.vanderlinden.com.br/

47

Incluindo arquivos

PHP define 4 funes para lidar com a incluso de arquivos: include require include_once require_once O arquivo a ser includo precisa ser local

http://marx.vanderlinden.com.br/

48

funcoes.php
<?php function media(){ $total = 0; foreach( func_get_args() as $arg ){ $total += $arg; } return $total / func_num_args(); } function mensagem(){ echo "Hello, World!"; } ?> http://marx.vanderlinden.com.br/

49

Pgina a ser exibida


<html> <head><title>Pgina de teste</title></head> <body> <?php require('funcoes.php'); mensagem(); echo ' ', media(4, 8, 15, 16, 23, 42), "\n"; ?> </body>
http://marx.vanderlinden.com.br/ 50

Resultado

<html> <head><title>Pgina de teste</title></head> <body> Hello, World! 18 </body>

http://marx.vanderlinden.com.br/

51

include vs. require

As funes include e require tm exatamente o mesmo comportamento, quando executam com sucesso. Entretanto, quando o arquivo a ser includo no encontrado:

include Emite um warning (aviso), e a execuo continua require Emite um erro, e a execuo pra
http://marx.vanderlinden.com.br/ 52

include_once, require_once

comum, em projetos de pequeno e mdio porte, que se armazenem vrios arquivos de funes, os quais fazem referncia uns aos outros. A estrutura de referncias pode rapidamente ficar complexa. A definio da mesma funo vrias vezes resulta em erro, no interpretador PHP.

http://marx.vanderlinden.com.br/

53

include_once, require_once

As funes include_once e require_once funcionam exatamente como suas anlogas, mas ignoram a segunda chamada para o mesmo arquivo na mesma estrutura de cdigos. Devem sempre ser usadas para incluir arquivos que pode chamar outros arquivos, contendo funes.

http://marx.vanderlinden.com.br/

54

Incluindo arquivos para Layout

desejvel que seja mantido um layout consistente entre as vrias pginas que compem um site. As funes include/require podem ser usadas para se atingir essa consistncia de duas maneiras.

http://marx.vanderlinden.com.br/

55

Mtodo 1

Criam-se dois arquivos a ser includos em todas as pginas

Ex: cabecalho.php rodape.php

http://marx.vanderlinden.com.br/

56

cabecalho.php
<html> <head> <title><?php echo $titulo; ?></title> <link href="layout.css" rel="stylesheet" type="text/css"> <link href="format.css" rel="stylesheet" type="text/css"> </head> <body> <div id="wrapper"><div id="bloco"> <div id="barratopo"> <img id="logo" src="img/logo.png" alt="Marx Gomes Van der Linden"/> http://marx.vanderlinden.com.br/ 57 (...)

rodape.php
</div></div> <div id="footer"> Texto do rodap </div></div> </div> </body> </html>

http://marx.vanderlinden.com.br/

58

Pginas do site
<?php $titulo = 'Pgina inicial'; require('cabecalho.php'); ?> <h1>Bem-vindo ao site!</h2> <p> Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas aliquam. Nam ut sapien. Suspendisse tempor adipiscing neque. </p> <?php require('rodape.php'); http://marx.vanderlinden.com.br/ ?>

59

Caractersticas do Mtodo 1

necessrio repetir algum cdigo, ainda que pequeno, no incio e no fim de cada pgina. Pode no ser suficientemente flexvel para todas as variaes de sites. Cada pgina ter sua URL no formato:

http://meusite.com/inicial.php http://meusite.com/contato.php http://meusite.com/ajuda.php


http://marx.vanderlinden.com.br/ 60

Mtodo 2

Criar uma pgina-mestre contendo todo o layout da pgina. Cada pgina individual criada separadamente, sem qualquer referncia ao layout. Na seo varivel, incluir a pgina apropriada, de acordo com a varivel recebida por GET.

http://marx.vanderlinden.com.br/

61

Mtodo 2
(...) <div id="wrapper"><div id="bloco"> <div id="barratopo"> <?php switch($_GET['pag']){ case 'ini': require('inicial.php'); break; case 'contato': require('contato.php'); break; } ?> </div></div> (...)
http://marx.vanderlinden.com.br/ 62

Caractersticas do Mtodo 2

No nenhuma repetio de cdigo em cada pgina individual. mais fcil manusear o layout da pginamestre. O cdigo da pgina-mestre pode se tornar complexo, principalmente quando se usam formulrios. Cada pgina tem a URL no seguinte formato:

http://meusite.com/index.php?pag=ini http://meusite.com/index.php?pag=contato http://marx.vanderlinden.com.br/ http://meusite.com/index.php?pag=ajuda

63

Você também pode gostar