Introdução ao PHP
<p class=\"negrito\">10. Funções</p>
<p align=\"JUSTIFY\"> </p>
<p align=\"JUSTIFY\">Definindo funções</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">A sintaxe básica para definir uma função
é:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
function nome_da_função([arg1, arg2, arg3])
{<br>
Comandos;<br>
...<br>
[return <valor de retorno>];<br>
}<br>
?> </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Qualquer código PHP válido pode estar
contido no interior de uma função. Como a checagem
de tipos em PHP é dinâmica, o tipo de retorno não
deve ser declarado, sendo necessário que o programador esteja
atento para que a função retorne o tipo desejado.
É recomendável que esteja tudo bem documentado para
facilitar a leitura e compreensão do código. Para
efeito de documentação, utiliza-se o seguinte formato
de declaração de função:</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\" class=\"mysql\">tipo function nome_da_funcao(tipo
arg1, tipo arg2, ...);</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Este formato só deve ser utilizado na documentação
do script, pois o PHP não aceita a declaração
de tipos. Isso significa que em muitos casos o programador deve
estar atento ao tipos dos valores passados como parâmetros,
pois se não for passado o tipo esperado não é
emitido nenhum alerta pelo interpretador PHP, já que este
não testa os tipos.</p>
<p align=\"JUSTIFY\"> </p>
<p align=\"JUSTIFY\">Valor de retorno</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Toda função pode opcionalmente retornar
um valor, ou simplesmente executar os comandos e não retornar
valor algum.</p>
<p align=\"JUSTIFY\">Não é possível que uma função
retorne mais de um valor, mas é permitido fazer com que uma
função retorne um valor composto, como listas ou arrays.</p>
<p align=\"JUSTIFY\"> </p>
<p align=\"JUSTIFY\">Argumentos</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">É possível passar argumentos para
uma função. Eles devem ser declarados logo após
o nome da função, entre parênteses, e tornam-se
variáveis pertencentes ao escopo local da função.
A declaração do tipo de cada argumento também
é utilizada apenas para efeito de documentação.</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
function imprime($texto){<br>
echo $texto;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">imprime("teste de funções");<br>
?> </span></p>
<p align=\"JUSTIFY\"> </p>
<p align=\"JUSTIFY\">Passagem de parâmetros por referência</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Normalmente, a passagem de parâmetros em
PHP é feita por valor, ou seja, se o conteúdo da variável
for alterado, essa alteração não afeta a variável
original.</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
function mais5($numero) {<br>
$numero += 5;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">$a = 3;</span></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">mais5($a); //$a continua valendo
3<br>
?> </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">No exemplo acima, como a passagem de parâmetros
é por valor, a função mais5 é inútil,
já que após a execução sair da função
o valor anterior da variável é recuperado. Se a passagem
de valor fosse feita por referência, a variável $a
teria 8 como valor. O que ocorre normalmente é que ao ser
chamada uma função, o interpretador salva todo o escopo
atual, ou seja, os conteúdos das variáveis. Se uma
dessas variáveis for passada como parâmetro, seu conteúdo
fica preservado, pois a função irá trabalhar
na verdade com uma cópia da variável. Porém,
se a passagem de parâmetros for feita por referência,
toda alteração que a função realizar
no valor passado como parâmetro afetará a variável
que o contém.</p>
<p align=\"JUSTIFY\">Há duas maneiras de fazer com que uma função
tenha parâmetros passados por referência: indicando
isso na declaração da função, o que
faz com que a pasagem de parâmetros sempre seja assim; e também
na própria chamada da função. Nos dois casos
utiliza-se o modificador "&". Vejamos um exemplo que
ilustra os dois casos:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
function mais5(&$num1, $num2) {<br>
$num1 += 5;<br>
$num2 += 5;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">$a = $b = 1;</span></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">mais5($a, $b); /* Neste caso,
só $num1 terá seu valor alterado, pois a passagem
por referência está definida na declaração
da função. */</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">mais5($a, &$b); /* Aqui
as duas variáveis terão seus valores alterados. */<br>
?> </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"> </p>
<p align=\"JUSTIFY\">Argumentos com valores pré-definidos
(default)</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Em PHP é possível ter valores default
para argumentos de funções, ou seja, valores que serão
assumidos em caso de nada ser passado no lugar do argumento. Quando
algum parâmetro é declarado desta maneira, a passagem
do mesmo na chamada da função torna-se opcional.</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
function teste($vivas = "testando") {<br>
echo $vivas;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">teste(); // imprime "testando"</span></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">teste("outro teste");
// imprime "outro teste"<br>
?> </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">É bom lembrar que quando a função
tem mais de um parâmetro, o que tem valor default deve
ser declarado por último:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
function teste($figura = circulo, $cor) {<br>
echo "a figura é um ", $figura, "
de cor " $cor;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">teste(azul); </span></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">/* A função não
vai funcionar da maneira esperada, ocorrendo um erro no interpretador.
A declaração correta é: */</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">function teste2($cor, $figura
= circulo) {<br>
echo "a figura é um ", $figura, "
de cor " $cor;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">teste2(azul);</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">/* Aqui a funcao funciona da
maneira esperada, ou seja, imprime o texto: "a figura é
um círculo de cor azul" */<br>
?> </span></p>
<p align=\"CENTER\"> </p>
<p align=\"JUSTIFY\">Contexto</p>
<p align=\"JUSTIFY\">O contexto é o conjunto de variáveis
e seus respectivos valores num determinado ponto do programa. Na
chamada de uma função, ao iniciar a execução
do bloco que contém a implementação da mesma
é criado um novo contexto, contendo as variáveis declaradas
dentro do bloco, ou seja, todas as variáveis utilizadas dentro
daquele bloco serão eliminadas ao término da execução
da função. </p>
<p align=\"JUSTIFY\">Escopo</p>
<p align=\"JUSTIFY\">O escopo de uma variável em PHP define a
porção do programa onde ela pode ser utilizada. Na
maioria dos casos todas as variáveis têm escopo global.
Entretanto, em funções definidas pelo usuário
um escopo local é criado. Uma variável de escopo global
não pode ser utilizada no interior de uma função
sem que haja uma declaração.</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
$vivas = "Testando";<br>
<br>
function Teste() {<br>
echo $vivas;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">Teste();<br>
?> </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">O trecho acima não produzirá saída
alguma, pois a variável $vivas é de escopo global,
e não pode ser referida num escopo local, mesmo que não
haja outra com nome igual que cubra a sua visibilidade. Para que
o script funcione da forma desejada, a variável global a
ser utilizada deve ser declarada.</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
$vivas = "Testando";</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">function Teste() {<br>
global $vivas;<br>
echo $vivas;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">Teste();<br>
?> </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Uma declaração "global"
pode conter várias variáveis, separadas por vírgulas.
Uma outra maneira de acessar variáveis de escopo global dentro
de uma função é utilizando um array pré-definido
pelo PHP cujo nome é $GLOBALS. O índice para a variável
referida é o proprio nome da variável, sem o caracter
$. O exemplo acima e o abaixo produzem o mesmo resultado:</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
$vivas = \"Testando\";</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">function Teste() {<br>
echo $GLOBALS[\"vivas\"]; // imprime $vivas<br>
echo $vivas; // não imprime nada<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">Teste();<br>
?></span></p>
<p align=\"JUSTIFY\"> </p>
<p align=\"JUSTIFY\">Definindo funções</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">A sintaxe básica para definir uma função
é:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
function nome_da_função([arg1, arg2, arg3])
{<br>
Comandos;<br>
...<br>
[return <valor de retorno>];<br>
}<br>
?> </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Qualquer código PHP válido pode estar
contido no interior de uma função. Como a checagem
de tipos em PHP é dinâmica, o tipo de retorno não
deve ser declarado, sendo necessário que o programador esteja
atento para que a função retorne o tipo desejado.
É recomendável que esteja tudo bem documentado para
facilitar a leitura e compreensão do código. Para
efeito de documentação, utiliza-se o seguinte formato
de declaração de função:</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\" class=\"mysql\">tipo function nome_da_funcao(tipo
arg1, tipo arg2, ...);</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Este formato só deve ser utilizado na documentação
do script, pois o PHP não aceita a declaração
de tipos. Isso significa que em muitos casos o programador deve
estar atento ao tipos dos valores passados como parâmetros,
pois se não for passado o tipo esperado não é
emitido nenhum alerta pelo interpretador PHP, já que este
não testa os tipos.</p>
<p align=\"JUSTIFY\"> </p>
<p align=\"JUSTIFY\">Valor de retorno</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Toda função pode opcionalmente retornar
um valor, ou simplesmente executar os comandos e não retornar
valor algum.</p>
<p align=\"JUSTIFY\">Não é possível que uma função
retorne mais de um valor, mas é permitido fazer com que uma
função retorne um valor composto, como listas ou arrays.</p>
<p align=\"JUSTIFY\"> </p>
<p align=\"JUSTIFY\">Argumentos</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">É possível passar argumentos para
uma função. Eles devem ser declarados logo após
o nome da função, entre parênteses, e tornam-se
variáveis pertencentes ao escopo local da função.
A declaração do tipo de cada argumento também
é utilizada apenas para efeito de documentação.</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
function imprime($texto){<br>
echo $texto;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">imprime("teste de funções");<br>
?> </span></p>
<p align=\"JUSTIFY\"> </p>
<p align=\"JUSTIFY\">Passagem de parâmetros por referência</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Normalmente, a passagem de parâmetros em
PHP é feita por valor, ou seja, se o conteúdo da variável
for alterado, essa alteração não afeta a variável
original.</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
function mais5($numero) {<br>
$numero += 5;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">$a = 3;</span></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">mais5($a); //$a continua valendo
3<br>
?> </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">No exemplo acima, como a passagem de parâmetros
é por valor, a função mais5 é inútil,
já que após a execução sair da função
o valor anterior da variável é recuperado. Se a passagem
de valor fosse feita por referência, a variável $a
teria 8 como valor. O que ocorre normalmente é que ao ser
chamada uma função, o interpretador salva todo o escopo
atual, ou seja, os conteúdos das variáveis. Se uma
dessas variáveis for passada como parâmetro, seu conteúdo
fica preservado, pois a função irá trabalhar
na verdade com uma cópia da variável. Porém,
se a passagem de parâmetros for feita por referência,
toda alteração que a função realizar
no valor passado como parâmetro afetará a variável
que o contém.</p>
<p align=\"JUSTIFY\">Há duas maneiras de fazer com que uma função
tenha parâmetros passados por referência: indicando
isso na declaração da função, o que
faz com que a pasagem de parâmetros sempre seja assim; e também
na própria chamada da função. Nos dois casos
utiliza-se o modificador "&". Vejamos um exemplo que
ilustra os dois casos:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
function mais5(&$num1, $num2) {<br>
$num1 += 5;<br>
$num2 += 5;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">$a = $b = 1;</span></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">mais5($a, $b); /* Neste caso,
só $num1 terá seu valor alterado, pois a passagem
por referência está definida na declaração
da função. */</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">mais5($a, &$b); /* Aqui
as duas variáveis terão seus valores alterados. */<br>
?> </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"> </p>
<p align=\"JUSTIFY\">Argumentos com valores pré-definidos
(default)</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Em PHP é possível ter valores default
para argumentos de funções, ou seja, valores que serão
assumidos em caso de nada ser passado no lugar do argumento. Quando
algum parâmetro é declarado desta maneira, a passagem
do mesmo na chamada da função torna-se opcional.</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
function teste($vivas = "testando") {<br>
echo $vivas;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">teste(); // imprime "testando"</span></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">teste("outro teste");
// imprime "outro teste"<br>
?> </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">É bom lembrar que quando a função
tem mais de um parâmetro, o que tem valor default deve
ser declarado por último:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
function teste($figura = circulo, $cor) {<br>
echo "a figura é um ", $figura, "
de cor " $cor;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">teste(azul); </span></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">/* A função não
vai funcionar da maneira esperada, ocorrendo um erro no interpretador.
A declaração correta é: */</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">function teste2($cor, $figura
= circulo) {<br>
echo "a figura é um ", $figura, "
de cor " $cor;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">teste2(azul);</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">/* Aqui a funcao funciona da
maneira esperada, ou seja, imprime o texto: "a figura é
um círculo de cor azul" */<br>
?> </span></p>
<p align=\"CENTER\"> </p>
<p align=\"JUSTIFY\">Contexto</p>
<p align=\"JUSTIFY\">O contexto é o conjunto de variáveis
e seus respectivos valores num determinado ponto do programa. Na
chamada de uma função, ao iniciar a execução
do bloco que contém a implementação da mesma
é criado um novo contexto, contendo as variáveis declaradas
dentro do bloco, ou seja, todas as variáveis utilizadas dentro
daquele bloco serão eliminadas ao término da execução
da função. </p>
<p align=\"JUSTIFY\">Escopo</p>
<p align=\"JUSTIFY\">O escopo de uma variável em PHP define a
porção do programa onde ela pode ser utilizada. Na
maioria dos casos todas as variáveis têm escopo global.
Entretanto, em funções definidas pelo usuário
um escopo local é criado. Uma variável de escopo global
não pode ser utilizada no interior de uma função
sem que haja uma declaração.</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
$vivas = "Testando";<br>
<br>
function Teste() {<br>
echo $vivas;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">Teste();<br>
?> </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">O trecho acima não produzirá saída
alguma, pois a variável $vivas é de escopo global,
e não pode ser referida num escopo local, mesmo que não
haja outra com nome igual que cubra a sua visibilidade. Para que
o script funcione da forma desejada, a variável global a
ser utilizada deve ser declarada.</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
$vivas = "Testando";</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">function Teste() {<br>
global $vivas;<br>
echo $vivas;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">Teste();<br>
?> </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Uma declaração "global"
pode conter várias variáveis, separadas por vírgulas.
Uma outra maneira de acessar variáveis de escopo global dentro
de uma função é utilizando um array pré-definido
pelo PHP cujo nome é $GLOBALS. O índice para a variável
referida é o proprio nome da variável, sem o caracter
$. O exemplo acima e o abaixo produzem o mesmo resultado:</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\"><?php<br>
$vivas = \"Testando\";</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">function Teste() {<br>
echo $GLOBALS[\"vivas\"]; // imprime $vivas<br>
echo $vivas; // não imprime nada<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">Teste();<br>
?></span></p>
Alguem descobriu onde baixar esse tutorial???
02/09/2008 8:57am
(~16 anos atrás)
Estou procurando a dias esse arquivos PDF com as imagens, pois não estou encontrando o arquivo completo, quero imprimir isso.
Obriado.
Obriado.
28/06/2007 5:30am
(~17 anos atrás)
Não consigo fazer o download através do link (http://phpbrasil.com/click.php?send=http://www.helo.tato.nom.br/arquivos/apostilaphp_mv.pdf).
01/06/2006 5:22am
(~18 anos atrás)
tentei no passado aprender por apostila,
mais livros ajudar muito ,em especial aquele que envolver o leitor num projeto.
esse tipo de trabalho ou livro são excelente ajuda : mais legal pela iniciativa
25/11/2005 10:32am
(~19 anos atrás)
As imagens não estão aparecendo e tentei acessar o site do autor, mas também não funciona.
Alguém tem disponível para download?
Alguém tem disponível para download?
24/06/2005 7:06pm
(~19 anos atrás)
dizem q a primeira impreção é a q fica,
axei bastante intuitivo.
:)
axei bastante intuitivo.
:)
24/04/2005 11:56pm
(~19 anos atrás)
Galera, quem estiver afim de baixar o tutorial é só acessar o seguinte link
http://www.helo.tato.nom.br/arquivos/apostilaphp_mv.pdf
Té +
http://www.helo.tato.nom.br/arquivos/apostilaphp_mv.pdf
Té +
11/03/2005 7:31pm
(~19 anos atrás)