Funções são formas de modularizar uma ou mais linhas de código de maneira que possam ser executadas em diferentes momentos do script/aplicação quando necessário.
Sintaxe de uma função
Toda função deve iniciar com function e possuir um nome identificador, podendo ter ou não parâmetros que devem ser definidos dentro de parênteses, já seu bloco de código é delimitado por chaves. A nomenclatura de uma função deve seguir as mesmas regras de nomenclatura de uma variável.
Retornando valores
Por padrão uma função retorna null, mas podemos especificar qual será seu valor de retorno utilizando o comando return.
Escopo de variáveis
O escopo de uma variável é o contexto onde esta foi definida, a maior parte das variáveis do PHP tem escopo local, que engloba outros scripts, incluídos através de include e require.
No exemplo acima a variável $var estará disponível no script test.php.
Porem quando definimos uma função em um script estamos criando um novo escopo local, o escopo da função. Este escopo bloqueia o acesso direto as variáveis definidas no escopo externo da função, conhecido como escopo global.
O PHP oferece algumas alternativas para que possamos trabalhar com variáveis de escopo global dentro de uma função, confira:
- Utilizando o comando global.
- Através do array superglobal $GLOBALS.
- Passando as variáveis por parâmetro/referência.
Neste artigo iremos abordar apenas a passagem de variáveis por parâmetro/referência, mas não deixe de ler mais sobre escopo de variáveis.
Passagem de parâmetros
Ao definir uma função podemos informar quais parâmetros esta função irá receber, geralmente os parâmetros são definidos de duas maneiras:
Parâmetro por valor
Parâmetro de valor padrão
A grande diferença é que no parâmetro de valor padrão, se não passarmos um valor para o parâmetro, o mesmo utilizará o valor definido no momento da declaração do mesmo, ou seja, seu valor padrão, mas devemos ter cuidado com este tipo de recurso, observe o caso a seguir, onde definimos um parâmetro de valor padrão seguido de um parâmetro por valor.
Neste caso não tem como o PHP identificar se estamos querendo passar o segundo parâmetro e armazena o valor passado na variável $first, sendo assim a variável $second não é informada, resultando em um warning de erro na quantidade de parâmetros esperados pela função e um notice informando que a variável $second não foi inicializada, undefined variable.
Verificando lista de parâmetros variáveis
Nem sempre sabemos quantos parâmetros uma função irá receber, para essa situação o PHP oferece métodos para verificar e resgatar quantidades indefinidas de parâmetros, confira:
Sintaxe | Parâmetros | Second |
---|---|---|
int func_num_args(void) | void (nenhum) | Quatidade de parâmetros |
array func_get_args(void) | void (nenhum) | Array de parâmetros |
mixed func_get_arg(int arg_num) | Índice do parâmetro | Valor do parâmetro |
No exemplo acima criamos uma função que retorna a média dos valores passados. Primeiro resgatamos a quantidade de parâmetros passados para função, em seguida resgatamos os valores, verificando se pelo menos um parâmetro foi informado e após somar todos os valores, dividimos pela quantidade de parâmetros, retornando o resultado desse cálculo.
Passagem de parâmetros por referência
Por padrão um parâmetro é passado como cópia(valor) para uma função, com isso, qualquer alteração que seja efetuada nesse parâmetro dentro da função(escopo local), não afetará seu ambiente externo(escopo global). Porém, existem casos em que precisamos que as alterações sejam mantidas no ambiente externo(escopo global), para esses casos, devemos passar o parâmetro como referência, utilizando & na frente do parâmetro no momento em que definimos a função.
Observe que nenhum valor foi retornado pela função, caso tenha alguma dúvida sobre como funciona referência no PHP dê uma olhada no artigo Variáveis e Constantes no PHP, onde falo sobre variáveis por referência.
Retornando referência de uma variável
Para retornar uma referência, precisamos utilizar o & em dois locais, primeiro no momento da definição da função, adicionando o mesmo antes do nome identificador da função e segundo ao receber o resultado da função, devemos atribuir o mesmo a uma variável adicionando o & após o operador de atribuição(=), confira o exemplo anterior alterado para retornar uma referência.
Neste exemplo além de alterar o conteúdo da variável $var dentro da função, retornamos sua referência para a variável $test no escopo global, onde realizamos uma adição e por fim exibimos o valor da variável $var.