Olá,
Hoje vamos falar sobre funções no PHP. Como declará-las? O que é escopo de variável? Variáveis locais, globais etc. A função é uma das principais estruturas de uma linguagem de programação, com elas economizamos muitas linhas de código, podendo reutilizar linhas e mais linhas, sem precisar reescrevê-las. Em resumo, o uso de funções nos poupa muito “trabalho de corno”. A idéia principal é: existem certas tarefas que nós executamos de forma rotineira dentro de um sistema. Um exemplo? Uma verificação de segurança para os dados enviados a partir de um formulário web, impedindo que um hacker invada nosso sistema via SQL INJECTION (eu vou falar disso mais pro fim do minicurso… Prometo!!!), por exemplo. Ou seja, temos que verificar cada campo do formulário e validá-lo… Digamos que nosso site seja pequeno, e possua só… hum… 200 campos de formulário. E aí, quer escrever o mesmo código de verificação de segurança duzentas vezes? Claro que não! É bem mais fácil criar uma rotina que faça essa verificação, e apenas alimentá-la com os dados a serem validados. Ou seja, montamos o procedimento uma única vez, e aí apenas alimentamos ele com os dados para validação, ele valida e retorna o conteúdo todo formatado e redondo. Pois é… Uma função serve pra isso: modulariza nosso sistema, permitindo que reutilizemos trechos de códigos que executem determinadas ações que possam ser utilizadas em locais distintos do nosso programa.
DECLARANDO UMA FUNÇÃO
A função é a unidade básica para dotar nosso código de reusabilidade. Seu funcionamento é o seguinte: recebe um ou mais parâmetros (argumentos), processa esses parâmetros e retorna um dado. Funções são nomeadas livremente, e seguem as mesmas regras de nomenclatura para variáveis (inicia com uma letra, corta espaços etc.). A sintaxe para declaração de uma função no PHP é a seguinte: function nome_da_funcao($parametro01, $parametro02, …, $parametroN) { //bloco de instruções }
O operador “function” é obrigatório, e devemos especificá-lo antes do nome da função. Os argumentos da função são passados entre parênteses, separados por vírgulas. Os argumentos são variáveis com um escopo de ação limitado ao trecho de código entre os delimitadores “{” e “}”. O bloco de instruções é o conjunto de códigos a ser executado pela função. Essas instruções serão executadas gerando um resultado (um valor inteiro, string, array etc.), que deve ser retornado para o módulo ativador da função (quem a chama). Esse valor será retornado por meio da cláusula “return”. Veja a declaração de uma função, assim como sua chamada:
1
2
3
4
5
6
7
8
| <?php
function calculaMedia($n1, $n2, $n3, $n4) {
$media = ($n1 + $n2 + $n3 + $n4) / 4;
return $media;
}
echo calculaMedia(5, 4, 3, 2);
?> |
A função calculaMedia é declarada na linha 2 e chamada na linha 6, os argumentos são passados na chamada da função, recebidos e tratados. O valor resultante do cálculo da média é retornado para a chamada da função por meio da cláusula “return”. Assim sendo, a função executa todas as tarefas entre “{” e “}”, devolvendo apenas o resultado dessas tarefas, nesse caso, a média aritmética de quatro notas.
VARIÁVEIS LOCAIS E GLOBAIS
Experimente imprimir fora da função (ou seja, fora dos delimitadores “{” e “}”) a variável “$media”. Não apareceu nada, né? Pois é… Variáveis declaradas dentro de uma função possuem o que chamamos de escopo local. São chamadas variáveis locais aquelas cujo escopo se resume a função a qual foram declaradas. Se referenciarmos uma variável local fora da função onde ela foi declarada, não teremos acesso ao seu valor, pois para o resto do programa, aquela variável não existe… Veja o código abaixo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| <?php
//Exemplo 01: Tento imprimir uma variável local fora do contexto de uma função
function calculaMedia($n1, $n2, $n3, $n4) {
$media = ($n1 + $n2 + $n3 + $n4) / 4;
return $media;
}
echo $media;
//Exemplo 02: Crio uma variável $media fora do contexto da função.
$media = 10;
function calculaMedia($n1, $n2, $n3, $n4) {
$media = ($n1 + $n2 + $n3 + $n4) / 4;
return $media;
}
echo $media;
//Exemplo 03: Imprimo o resultado da função e a variável $media
$media = 10;
function calculaMedia($n1, $n2, $n3, $n4) {
$media = ($n1 + $n2 + $n3 + $n4) / 4;
return $media;
}
echo $media."<br />".calculaMedia(5, 6, 7, 8);
?> |
Percebeu que o PHP trata de forma diferenciada as variáveis declaradas dentro e fora de uma função? E por que quando declarei $media, em um escopo mais amplo que o local, ela não sobrescreveu a variável local homônima? Simples: variáveis locais predominam dentro do escopo da função. Ok, até aqui todos entenderam. E se eu quiser tornar disponível para todo o programa uma variável declarada dentro de uma função, sem precisar retorná-la? Ou declarar uma variável fora do escopo local, e ainda assim torná-la disponível dentro da função? A solução para isso é declarar uma variável como “global”. Variáveis globais são aquelas acessadas a partir de qualquer ponto da aplicação. Para declarar uma variável global, basta usar a cláusula “global”. Veja o código:
1
2
3
4
5
6
7
8
9
10
11
12
| <?php
//Declarando variáveis globais
$somaNotas = 10;
function calculaMedia() {
global $somaNotas;
$media = $somaNotas / 4;
return $media;
}
echo calculaMedia();
?> |
PASSANDO PARÂMETROS
Existem duas formas de passar parâmetros para uma função: por valor e por referência. A passagem de parâmetros por valor é o modo default do PHP: nessa situação os parâmetros são tratados como variáveis locais da função, independente do seu valor externo. Veja um exemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <?php
function calculaMedia($n1, $n2, $n3, $n4) {
$media = ($n1 + $n2 + $n3 + $n4) / 4;
$n1 = $n3;
$n2 = $n4;
return $media;
}
$n1 = 5;
$n2 = 6;
$n3 = 7;
$n4 = 8;
calculaMedia($n1, $n2, $n3, $n4);
echo $n1, $n2, $n3, $n4;
?> |
Ok. As variáveis manipuladas dentro de uma função não alteram valores de variáveis externas. Agora, com a passagem de parâmetros por referência, todas as alterações realizadas na variável dentro da função são válidas para o escopo externo à função. Para indicar a passagem de parâmetros por referência, é preciso utilizar o operador & antes do parâmetro. Veja como fica:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <?php
$n1 = 5;
$n2 = 6;
$n3 = 7;
$n4 = 8;
function calculaMedia(&$n1, &$n2, &$n3, &$n4) {
$media = ($n1 + $n2 + $n3 + $n4) / 4;
$n1 = $n3;
$n2 = $n4;
return $media;
}
calculaMedia($n1, $n2, $n3, $n4);
echo $n1, $n2, $n3, $n4;
?> |
CALCULANDO O NÚMERO DE ARGUMENTOS DE UMA FUNÇÃO
O PHP permite nos permite passar N argumentos para uma função, mesmo que eu não saiba quantos e quais são esses parâmetros. Ou seja, eu posso resgatar os parâmetros de uma função de forma dinâmica. A função func_get_args() retorna um array com todos os argumentos da função. Já a função func_num_args() retorna o número de argumentos que essa função possui. Veja o código abaixo:
1
2
3
4
5
6
7
8
9
10
11
12
13
| <?php
function calculaMedia() {
$args = func_get_args();
$numArgs = func_num_args();
$soma = 0;
foreach ($args as $val) {
$soma += $val;
}
$media = $soma / $numArgs;
return $media;
}
echo calculaMedia(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
?> |
Durante todo o minicurso trabalharemos com funções, sejam as nativas da linguagem ou aquelas que criaremos durante os tutoriais. Estudem bem o tema e até amanhã com o último tutorial dessa parte sobre introdução ao PHP: requisição de arquivos com as funções include() e require(). Até lá!
Abraços,
Diego.