+5

Introdução ao PHP

criado por João Prado Maia em 25/01/2001 6:32pm
<p class=\"negrito\">10. Fun&ccedil;&otilde;es</p>
<p align=\"JUSTIFY\">&nbsp;</p>
<p align=\"JUSTIFY\">Definindo fun&ccedil;&otilde;es</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">A sintaxe b&aacute;sica para definir uma fun&ccedil;&atilde;o
&eacute;:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\">&lt;?php<br>
function nome_da_fun&ccedil;&atilde;o([arg1, arg2, arg3])
{<br>
&nbsp;&nbsp;Comandos;<br>
&nbsp;&nbsp;...<br>
&nbsp;&nbsp;[return &lt;valor de retorno&gt;];<br>
}<br>
?&gt; </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Qualquer c&oacute;digo PHP v&aacute;lido pode estar
contido no interior de uma fun&ccedil;&atilde;o. Como a checagem
de tipos em PHP &eacute; din&acirc;mica, o tipo de retorno n&atilde;o
deve ser declarado, sendo necess&aacute;rio que o programador esteja
atento para que a fun&ccedil;&atilde;o retorne o tipo desejado.
&Eacute; recomend&aacute;vel que esteja tudo bem documentado para
facilitar a leitura e compreens&atilde;o do c&oacute;digo. Para
efeito de documenta&ccedil;&atilde;o, utiliza-se o seguinte formato
de declara&ccedil;&atilde;o de fun&ccedil;&atilde;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&oacute; deve ser utilizado na documenta&ccedil;&atilde;o
do script, pois o PHP n&atilde;o aceita a declara&ccedil;&atilde;o
de tipos. Isso significa que em muitos casos o programador deve
estar atento ao tipos dos valores passados como par&acirc;metros,
pois se n&atilde;o for passado o tipo esperado n&atilde;o &eacute;
emitido nenhum alerta pelo interpretador PHP, j&aacute; que este
n&atilde;o testa os tipos.</p>
<p align=\"JUSTIFY\">&nbsp;</p>
<p align=\"JUSTIFY\">Valor de retorno</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Toda fun&ccedil;&atilde;o pode opcionalmente retornar
um valor, ou simplesmente executar os comandos e n&atilde;o retornar
valor algum.</p>
<p align=\"JUSTIFY\">N&atilde;o &eacute; poss&iacute;vel que uma fun&ccedil;&atilde;o
retorne mais de um valor, mas &eacute; permitido fazer com que uma
fun&ccedil;&atilde;o retorne um valor composto, como listas ou arrays.</p>
<p align=\"JUSTIFY\">&nbsp;</p>
<p align=\"JUSTIFY\">Argumentos</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">&Eacute; poss&iacute;vel passar argumentos para
uma fun&ccedil;&atilde;o. Eles devem ser declarados logo ap&oacute;s
o nome da fun&ccedil;&atilde;o, entre par&ecirc;nteses, e tornam-se
vari&aacute;veis pertencentes ao escopo local da fun&ccedil;&atilde;o.
A declara&ccedil;&atilde;o do tipo de cada argumento tamb&eacute;m
&eacute; utilizada apenas para efeito de documenta&ccedil;&atilde;o.</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\">&lt;?php<br>
function imprime($texto){<br>
&nbsp;&nbsp;echo $texto;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">imprime(&quot;teste de fun&ccedil;&otilde;es&quot;);<br>
?&gt; </span></p>
<p align=\"JUSTIFY\">&nbsp;</p>
<p align=\"JUSTIFY\">Passagem de par&acirc;metros por refer&ecirc;ncia</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Normalmente, a passagem de par&acirc;metros em
PHP &eacute; feita por valor, ou seja, se o conte&uacute;do da vari&aacute;vel
for alterado, essa altera&ccedil;&atilde;o n&atilde;o afeta a vari&aacute;vel
original.</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\">&lt;?php<br>
function mais5($numero) {<br>
&nbsp;&nbsp;$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>
?&gt; </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">No exemplo acima, como a passagem de par&acirc;metros
&eacute; por valor, a fun&ccedil;&atilde;o mais5 &eacute; in&uacute;til,
j&aacute; que ap&oacute;s a execu&ccedil;&atilde;o sair da fun&ccedil;&atilde;o
o valor anterior da vari&aacute;vel &eacute; recuperado. Se a passagem
de valor fosse feita por refer&ecirc;ncia, a vari&aacute;vel $a
teria 8 como valor. O que ocorre normalmente &eacute; que ao ser
chamada uma fun&ccedil;&atilde;o, o interpretador salva todo o escopo
atual, ou seja, os conte&uacute;dos das vari&aacute;veis. Se uma
dessas vari&aacute;veis for passada como par&acirc;metro, seu conte&uacute;do
fica preservado, pois a fun&ccedil;&atilde;o ir&aacute; trabalhar
na verdade com uma c&oacute;pia da vari&aacute;vel. Por&eacute;m,
se a passagem de par&acirc;metros for feita por refer&ecirc;ncia,
toda altera&ccedil;&atilde;o que a fun&ccedil;&atilde;o realizar
no valor passado como par&acirc;metro afetar&aacute; a vari&aacute;vel
que o cont&eacute;m.</p>
<p align=\"JUSTIFY\">H&aacute; duas maneiras de fazer com que uma fun&ccedil;&atilde;o
tenha par&acirc;metros passados por refer&ecirc;ncia: indicando
isso na declara&ccedil;&atilde;o da fun&ccedil;&atilde;o, o que
faz com que a pasagem de par&acirc;metros sempre seja assim; e tamb&eacute;m
na pr&oacute;pria chamada da fun&ccedil;&atilde;o. Nos dois casos
utiliza-se o modificador &quot;&amp;&quot;. Vejamos um exemplo que
ilustra os dois casos:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\">&lt;?php<br>
function mais5(&amp;$num1, $num2) {<br>
&nbsp;&nbsp;$num1 += 5;<br>
&nbsp;&nbsp;$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&oacute; $num1 ter&aacute; seu valor alterado, pois a passagem
por refer&ecirc;ncia est&aacute; definida na declara&ccedil;&atilde;o
da fun&ccedil;&atilde;o. */</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">mais5($a, &amp;$b); /* Aqui
as duas vari&aacute;veis ter&atilde;o seus valores alterados. */<br>
?&gt; </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">&nbsp;</p>
<p align=\"JUSTIFY\">Argumentos com valores pr&eacute;-definidos
(default)
</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Em PHP &eacute; poss&iacute;vel ter valores default
para argumentos de fun&ccedil;&otilde;es, ou seja, valores que ser&atilde;o
assumidos em caso de nada ser passado no lugar do argumento. Quando
algum par&acirc;metro &eacute; declarado desta maneira, a passagem
do mesmo na chamada da fun&ccedil;&atilde;o torna-se opcional.</p>
<p align=\"JUSTIFY\"><span class=\"mysql\">&lt;?php<br>
function teste($vivas = &quot;testando&quot;) {<br>
&nbsp;&nbsp;echo $vivas;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">teste(); // imprime &quot;testando&quot;</span></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">teste(&quot;outro teste&quot;);
// imprime &quot;outro teste&quot;<br>
?&gt; </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">&Eacute; bom lembrar que quando a fun&ccedil;&atilde;o
tem mais de um par&acirc;metro, o que tem valor default deve
ser declarado por &uacute;ltimo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\">&lt;?php<br>
function teste($figura = circulo, $cor) {<br>
&nbsp;&nbsp;echo &quot;a figura &eacute; um &quot;, $figura, &quot;
de cor &quot; $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&ccedil;&atilde;o n&atilde;o
vai funcionar da maneira esperada, ocorrendo um erro no interpretador.
A declara&ccedil;&atilde;o correta &eacute;: */</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">function teste2($cor, $figura
= circulo) {<br>
&nbsp;&nbsp;echo &quot;a figura &eacute; um &quot;, $figura, &quot;
de cor &quot; $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: &quot;a figura &eacute;
um c&iacute;rculo de cor azul&quot; */<br>
?&gt; </span></p>
<p align=\"CENTER\">&nbsp;</p>
<p align=\"JUSTIFY\">Contexto</p>
<p align=\"JUSTIFY\">O contexto &eacute; o conjunto de vari&aacute;veis
e seus respectivos valores num determinado ponto do programa. Na
chamada de uma fun&ccedil;&atilde;o, ao iniciar a execu&ccedil;&atilde;o
do bloco que cont&eacute;m a implementa&ccedil;&atilde;o da mesma
&eacute; criado um novo contexto, contendo as vari&aacute;veis declaradas
dentro do bloco, ou seja, todas as vari&aacute;veis utilizadas dentro
daquele bloco ser&atilde;o eliminadas ao t&eacute;rmino da execu&ccedil;&atilde;o
da fun&ccedil;&atilde;o. </p>
<p align=\"JUSTIFY\">Escopo</p>
<p align=\"JUSTIFY\">O escopo de uma vari&aacute;vel em PHP define a
por&ccedil;&atilde;o do programa onde ela pode ser utilizada. Na
maioria dos casos todas as vari&aacute;veis t&ecirc;m escopo global.
Entretanto, em fun&ccedil;&otilde;es definidas pelo usu&aacute;rio
um escopo local &eacute; criado. Uma vari&aacute;vel de escopo global
n&atilde;o pode ser utilizada no interior de uma fun&ccedil;&atilde;o
sem que haja uma declara&ccedil;&atilde;o.</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\">&lt;?php<br>
$vivas = &quot;Testando&quot;;<br>
<br>
function Teste() {<br>
&nbsp;&nbsp;echo $vivas;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">Teste();<br>
?&gt; </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">O trecho acima n&atilde;o produzir&aacute; sa&iacute;da
alguma, pois a vari&aacute;vel $vivas &eacute; de escopo global,
e n&atilde;o pode ser referida num escopo local, mesmo que n&atilde;o
haja outra com nome igual que cubra a sua visibilidade. Para que
o script funcione da forma desejada, a vari&aacute;vel global a
ser utilizada deve ser declarada.</p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Exemplo:</p>
<p align=\"JUSTIFY\"><span class=\"mysql\">&lt;?php<br>
$vivas = &quot;Testando&quot;;</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">function Teste() {<br>
&nbsp;&nbsp;global $vivas;<br>
&nbsp;&nbsp;echo $vivas;<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">Teste();<br>
?&gt; </span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\">Uma declara&ccedil;&atilde;o &quot;global&quot;
pode conter v&aacute;rias vari&aacute;veis, separadas por v&iacute;rgulas.
Uma outra maneira de acessar vari&aacute;veis de escopo global dentro
de uma fun&ccedil;&atilde;o &eacute; utilizando um array pr&eacute;-definido
pelo PHP cujo nome &eacute; $GLOBALS. O &iacute;ndice para a vari&aacute;vel
referida &eacute; o proprio nome da vari&aacute;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\">&lt;?php<br>
$vivas = \"Testando\";</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">function Teste() {<br>
&nbsp;&nbsp;echo $GLOBALS[\"vivas\"]; // imprime $vivas<br>
&nbsp;&nbsp;echo $vivas; // n&atilde;o imprime nada<br>
}</span></p>
<p align=\"JUSTIFY\"></p>
<p align=\"JUSTIFY\"><span class=\"mysql\">Teste();<br>
?&gt;</span></p>

Comentários:

Mostrando 1 - 10 de 19 comentários
Alguem descobriu onde baixar esse tutorial???
02/09/2008 8:57am (~12 anos atrás)

Como baixar o tutorial ?
24/05/2008 2:56pm (~12 anos atrás)

João Santos disse:
como baixo o tutorial?

obrigado
30/03/2008 8:16am (~12 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.
28/06/2007 5:30am (~13 anos atrás)

Cyrus disse:
01/06/2006 5:22am (~14 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 (~15 anos atrás)

Legal colega - me ajudou muito !
28/09/2005 6:29pm (~15 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?
24/06/2005 7:06pm (~15 anos atrás)

dizem q a primeira impreção é a q fica,
axei bastante intuitivo.
:)
24/04/2005 11:56pm (~15 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é +
11/03/2005 7:31pm (~15 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)