Desenvolvimento - PHP

Trabalhando com funções em PHP

Veja neste artigo como trabalhar com funções na linguagem PHP, entendendo sua declaração, passagem de parâmetros, retorno e acesso a variáveis locais e globais.

por Joel Rodrigues



Funções podem ser definidas blocos de código com um objetivo específico, identificados por um nome através do qual pode ser referenciado á partir de várias partes do código. Essa é uma das principais técnicas utilizadas para garantir a reutilização de código, tornando a programação mais prática e o código mais “limpo” e organizado.

O objetivo deste artigo não é apresentar de forma aprofundada os conceitos a cerca de funções na programação em geral, mas sim explicar os principais pontos relacionados a manipulação de funções na linguagem PHP.

Definição e utilização

A declaração de funções no PHP é feita a partir da palavra reservada function seguida do nome da função e de sua lista de argumentos, enquanto o corpo da função é delimitado por chaves ({ e }), entre as quais deve ficar todo o conjunto de instruções a ser executado quando a função for invocada.

A Listagem 1 apresenta a estrutura básica de uma função teórica, para facilitar a compreensão das regras citadas.

Listagem 1: Estrutura básica de uma função

function nome_funcao($par1, $par2, $par3...$parN)
{
	//instruções
}

Algumas considerações sobre o código acima:

  • A palavra reservada function é imutável e obrigatória, é ela que define o bloco de código como uma função.
  • O “nome_funcao” deve ser um valor significativo, pelo qual os comandos sejam facilmente identificados. Assim como as variáveis, não pode ser iniciado com números ou caracteres especiais, exceto o underline (_). Geralmente inicia-se o nome da função com letra minúscula, mas esta não é uma convenção, cabe a cada um decidir que notação utilizar.
  • Os valores entre parênteses são chamados de parâmetros ou argumentos e são valores dos quais a função depende para ser executada corretamente. Nem sempre os argumentos são necessários, então pode-se omiti-los na definição da função, mantendo apenas os parênteses.

As funções podem ser classificadas quanto ao seu retorno como vazias (void) ou com retorno. As funções void ou sem retorno apenas executam uma série de comandos sem a obrigação de devolver um valor específico como resultado. Já as funções com retorno, ao serem executadas, resultam diretamente em um dado valor que, no PHP, não tem tipo definido.

A seguir são apresentados alguns exemplos que demonstram a utilização desses conceitos, além de mostrar como utilizar as funções após sua definição.

Listagem 2: Função sem parâmetro e sem retorno

function exibir_mensagem()
{
	echo "Olá\n";
	echo "Seja Bem Vindo(a)!"
}

Listagem 3: Função com parâmetro e sem retorno

function exibir_mensagem($nome)
{
	echo "Olá\n";
	echo $nome
}

Listagem 4: Invocando uma função sem retorno

<?php
	//definição da função
	function exibir_mensagem($nome)
	{
		echo "Olá\n";
		echo $nome;
	}
	
	//chamando a função
	exibir_mensagem("Joel Rodrigues");
?>

A chamada à função sem parâmetro é ainda mais simples, bastaria não informar nenhum valor entre parênteses.

Listagem 5: Função sem parâmetro e com retorno

<?php
	//definição da função
	function dia_atual()
	{
		$hoje = getdate();
		switch($hoje["wday"])
		{
			case 0:
			return "Domingo";
			break;
			case 1:
			return "Segunda";
			break;
			case 2:
			return "Terça";
			break;
			case 3:
			return "Quarta";
			break;
			case 4:
			return "Quinta";
			break;
			case 5:
			return "Sexta";
			break;
			case 6:
			return "Sábado";
			break;
		}
	}
	//chamada à fução
	$dia = dia_atual();
	echo $dia;
?>

A função “dia_atual” verifica o dia da semana e de acordo com seu valor (inteiro entre 0 e 6), retorna o nome dia em português. A palavra reservada return é utilizada para definir o resultado da função e sinaliza também o fim da execução desta. Qualquer código que venha a ser posto após o return (o que não deve ocorrer) será desconsiderado.

Listagem 6: Função com parâmetro e com retorno

<?php
	//definição da função
	function somar($numA, $numB)
	{
		return $numA + $numB;
	}

	$resultado = somar(1,2);
	echo $resultado;
?>

Como vimos, o resultado das funções pode ser utilizado facilmente atribuindo-se seu valor a uma variável. Pode-se ainda utilizar o retorno diretamente, por exemplo, como argumento de outra função como somar(somar(1,2), somar(3,4)).

Acesso a variáveis

Um ponto cujo entendimento é fundamental quando se trabalha com funções é o acesso e manipulação de variáveis nesse tipo de estrutura de código. É importante ter em mente duas definições ou classificações de variáveis: GLOBAL e LOCAL.

As variáveis locais são aquelas declaradas no corpo da função e só podem ser acessadas dentro desta. Este tipo de variável é utilizado para realizar cálculos e outros processamentos internos da função, sendo alocadas e liberadas durante sua execução.

A seguir é mostrado um exemplo de utilização de variável local em uma função.

Listagem 7: Função com variável local

<?php
	function par_ou_impar($num)
	{
		$resto = $num % 2;
		if($resto == 0)
			return "PAR";
		else
			return "IMPAR";
	}
	//fora da função não é possível acessar a variável $resto 
?>

A função “par_ou_impar” usa uma variável local “$resto” para armazenar o resto da divisão do número recebido como parâmetro por dois. Se o resto da divisão for igual a zero, isso indica que o número é par, caso contrário, é impar.

As variáveis globais, por sua vez, podem ser acessadas a partir de qualquer ponto do código e são usadas para armazenar informações que precisam ser utilizadas por várias funções distintas ou acessadas diretamente.

No exemplo da Listagem 8, existe uma variável “$saldo” que é acessada por duas funções: “depositar” e “sacar”. Se a qualquer momento for preciso obter o valor dessa variável (ou alterá-lo), bastaria acessá-la diretamente.

Listagem 8: Utilização de variável global

Por fim, é preciso citar um tipo especial de variável local, as variáveis ESTÁTICAS. Esse tipo de variável, apesar de ser declarado dentro do corpo da função, não é descartado após a execução desta. Para definir uma variável como estática é utilizada a palavra reservada static antes do nome da mesma no momento de sua declaração.

O funcionamento dessas variáveis é semelhante ao das globais, com a diferença que as estáticas são acessíveis apenas dentro da função, mesmo tendo seu valor mantido entre as execuções.

Para facilitar o entendimento desse conceito, o exemplo da Listagem 8 foi alterado e apresentado na Listagem 9, onde cada função passa a ter uma variável estática que armazena o número de vezes que ela foi chamada.

Listagem 9: Utilização de variáveis estáticas

<?php
	function depositar($valor)
	{
		static $total_depositos;
		$total_depositos++;
		$saldo += $valor;
		echo "Foram feitos ".$total_depositos." depósitos.";
	}

	function sacar($valor)
	{
		static $total_saques;
		$total_saques++;
		$saldo -= $valor;
		echo "Foram feitos ".$total_saques." saques.";
	}
?>

Passagem de parâmetros

Nesse ponto do artigo a passagem de parâmetros já foi vista superficialmente, essa seção mostra alguns detalhes importantes sobre a utilização de argumentos nas funções.

Um dos principais conceitos relacionados aos de parâmetros para funções está na forma como os argumentos são passados. A passagem de parâmetros pode ser feita de duas formas: POR VALOR e POR REFERÊNCIA.

Estas informações são realmente relevantes quando passamos variáveis como argumentos para funções, pois definem a forma como essas variáveis são tratadas no corpo do método.

Na passagem por valor (que é a forma padrão), quando se passa uma variável como argumento para uma função, é feita uma cópia interna dessa variável, a qual é acessada e modificada durante a execução. Após o término da função, a variável original não tem sofrido nenhuma alteração.

Já quando as variáveis são passadas por referência para uma função, seu valor é acessado diretamente e pode sofrer alterações durante a execução. Para indicar que um argumento deve ser recebido por referência, deve-se adicionar o operador & antes do nome do parâmetro, na declaração da função.

A Listagem 10, a seguir, mostra duas versões de uma mesma função. A primeira recebe argumentos por valor e retorna apenas o resultado da soma dos dois valores informados. Na segunda, o primeiro parâmetro é recebido por referência e, nesse caso, a função não tem retorno, pois a variável informada sofre diretamente a alteração (soma do segundo argumento).

Listagem 10: Utilização de variáveis estáticas

<?php
	function somar($numA, $numB)
	{
		return $numA + $numB
	}

	function somar(&$numA, $numB)
	{
		$numA += $numB;
	}
?>

Observação: quando é definido que um parâmetro deve ser passado por referência, na chamada da função deve ser informada uma variável obrigatoriamente e não um valor qualquer, como se vê na Listagem 6.

Quantidade de parâmetros variável

A linguagem PHP possui uma funcionalidade bastante útil que permite definir funções que recebam um número indefinido de argumentos, com isso, pode-se acessar vários parâmetros dinamicamente, mesmo sem que seja previamente definida a quantidade e nome dos mesmos. Dentro da função, utiliza-se as funções func_get_args() e func_num_args() que retornam um array contendo os argumentos e a quantidade destes, respectivamente.

A seguir é apresentado um exemplo, retomando a função “somar”, que define uma função para a qual se pode passar vários números como parâmetro e ela retornará a soma deles.

Listagem 11: Utilização de variáveis estáticas

<?php
	function somar()
	{
		$numeros = func_get_args();
		$qtd_nums = func_num_args();
		$soma = 0;
		for($i = 0; $i < $qtd_nums;$i++)
		{
			$soma += $numeros[$i];
		}
		return $soma;
	}
	//testando a função
	echo somar(1, 2, 3, 4, 5);
?>

Conclusão

Trabalhar com funções em PHP é bastante simples e eficiente, devido aos recursos e sintaxe da linguagem. Assim, torna-se fácil e prático promover a reusabilidade de código nas aplicações.

Finalizo aqui este artigo. Até a próxima publicação.

Conheça o curso online Programação e boas práticas com PHP da Devmedia

Joel Rodrigues

Joel Rodrigues - Técnico em Informática - IFRN Cursando Bacharelado em Ciências e Tecnologia - UFRN Programador .NET/C# e Delphi há quase 3 anos, já tendo trabalhado com Webservices, WPF, Windows Phone 7 e ASP.NET, possui ainda conhecimentos em HTML, CSS e Javascript (JQuery).