|
|
|
|
@@ -1,5 +1,5 @@
|
|
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
|
|
|
<!-- EN-Revision: 489d46bc2598784bd3711454ccab8940107cde67 Maintainer: ae Status: ready --><!-- CREDITS: fabioluciano,ae,geekcom,lhsazevedo,leonardolara -->
|
|
|
|
|
<!-- EN-Revision: ee205135d091ffca38bebfb33b4ca7e51cf87625 Maintainer: ae Status: ready --><!-- CREDITS: fabioluciano,ae,geekcom,lhsazevedo,leonardolara -->
|
|
|
|
|
<chapter xml:id="language.functions" xmlns="http://docbook.org/ns/docbook">
|
|
|
|
|
<title>Funções</title>
|
|
|
|
|
|
|
|
|
|
@@ -170,13 +170,15 @@ function recursion($a)
|
|
|
|
|
</sect1>
|
|
|
|
|
|
|
|
|
|
<sect1 xml:id="functions.arguments">
|
|
|
|
|
<title>Argumentos de funções</title>
|
|
|
|
|
<title>Parâmetros e argumentos de funções</title>
|
|
|
|
|
|
|
|
|
|
<simpara>
|
|
|
|
|
Informações podem ser passadas para funções através da lista de argumentos, que é uma
|
|
|
|
|
lista de expressões delimitados por vírgulas. Os argumentos são avaliados
|
|
|
|
|
da esquerda para a direita, e antes que a função seja efetivamente chamada
|
|
|
|
|
(avaliação antecipada <emphasis>eager</emphasis>).
|
|
|
|
|
Os parâmetros de uma função são declarados em sua assinatura.
|
|
|
|
|
Informações podem ser passadas para funções através da lista de argumentos,
|
|
|
|
|
que é uma lista de expressões delimitadas por vírgulas. Os argumentos são
|
|
|
|
|
avaliados da esquerda para a direita, e o resultado é atribuído aos parâmetros da
|
|
|
|
|
função, antes que a função seja efetivamente chamada
|
|
|
|
|
(avaliação <emphasis>ansiosa</emphasis>).
|
|
|
|
|
</simpara>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
@@ -204,12 +206,12 @@ function takes_array($input)
|
|
|
|
|
</example>
|
|
|
|
|
</para>
|
|
|
|
|
<para>
|
|
|
|
|
A partir do PHP 8.0.0, a lista de argumentos de uma função pode incluir uma vírgula final,
|
|
|
|
|
que será ignorada. Isto é particularmente útil nos casos que a quantidade de argumentos é
|
|
|
|
|
longa ou contém nomes longos, sendo conveniente listar os argumentos verticalmente.
|
|
|
|
|
A partir do PHP 8.0.0, a lista de parâmetros de uma função pode incluir uma vírgula final, que
|
|
|
|
|
será ignorada. Isto é particularmente útil nos casos em que a lista de parâmetros é
|
|
|
|
|
longa ou contém nomes de variáveis longos, tornando conveniente listar os parâmetros verticalmente.
|
|
|
|
|
</para>
|
|
|
|
|
<example>
|
|
|
|
|
<title>Argumentos de função com uma vírgula final</title>
|
|
|
|
|
<title>Parâmetros de função com uma vírgula final</title>
|
|
|
|
|
<programlisting role="php">
|
|
|
|
|
<![CDATA[
|
|
|
|
|
<?php
|
|
|
|
|
@@ -239,11 +241,11 @@ function takes_many_args(
|
|
|
|
|
</simpara>
|
|
|
|
|
<para>
|
|
|
|
|
Para ter um argumento para uma função sempre passado por referência, adicione
|
|
|
|
|
antes dele um "e comercial" (&) ao nome do argumento na definição da função:
|
|
|
|
|
antes dele um "e comercial" (&) ao nome do parâmetro na definição da função:
|
|
|
|
|
</para>
|
|
|
|
|
<para>
|
|
|
|
|
<example>
|
|
|
|
|
<title>Passando parâmetros de função por referência</title>
|
|
|
|
|
<title>Passando argumentos de função por referência</title>
|
|
|
|
|
<programlisting role="php">
|
|
|
|
|
<![CDATA[
|
|
|
|
|
<?php
|
|
|
|
|
@@ -260,16 +262,16 @@ echo $str; // imprime 'Isto é uma string, e alguma coisa mais.'
|
|
|
|
|
</example>
|
|
|
|
|
</para>
|
|
|
|
|
<para>
|
|
|
|
|
É um erro passar um argumento por valor onde é esperado a passagem por referência.
|
|
|
|
|
É um erro passar uma expressão constante como argumento em um parâmetro que espera ser passado por referência.
|
|
|
|
|
</para>
|
|
|
|
|
</sect2>
|
|
|
|
|
<sect2 xml:id="functions.arguments.default">
|
|
|
|
|
<title>Valores padrão de argumentos</title>
|
|
|
|
|
<title>Valores padrão de parâmetros</title>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
Uma função pode definir valores padrão para argumentos usando sintaxe similar
|
|
|
|
|
a atribuição de uma variável. O padrão é usado apenas quando o parâmetro não
|
|
|
|
|
é especificado. Em particular, note que passar &null; <emphasis>não</emphasis>
|
|
|
|
|
Uma função pode definir valores padrão para parâmetros usando sintaxe similar
|
|
|
|
|
à atribuição de uma variável. O padrão é usado apenas quando o argumento do parâmetro não
|
|
|
|
|
é passado. Observe que passar &null; <emphasis>não</emphasis>
|
|
|
|
|
atribui o valor padrão.
|
|
|
|
|
</para>
|
|
|
|
|
<para>
|
|
|
|
|
@@ -367,8 +369,8 @@ Preparando um belo café só para você.
|
|
|
|
|
exemplo) uma variável, um membro de classe ou uma chamada de função.
|
|
|
|
|
</simpara>
|
|
|
|
|
<para>
|
|
|
|
|
Note que quaisquer argumentos opcionais devem ser especificados após os
|
|
|
|
|
argumentos obrigatórios, caso contrário, eles não podem ser omitidos das chamadas.
|
|
|
|
|
Observe que quaisquer parâmetros opcionais devem ser especificados após os
|
|
|
|
|
parâmetros obrigatórios, caso contrário, eles não podem ser omitidos das chamadas.
|
|
|
|
|
Considere o seguinte exemplo:
|
|
|
|
|
</para>
|
|
|
|
|
<para>
|
|
|
|
|
@@ -427,7 +429,7 @@ Fazendo um(a) tigela de iogurte de framboesa.
|
|
|
|
|
</para>
|
|
|
|
|
<para>
|
|
|
|
|
<example>
|
|
|
|
|
<title>Uso correto de argumentos padrão de função</title>
|
|
|
|
|
<title>Uso correto de parâmetros padrão de função</title>
|
|
|
|
|
<programlisting role="php">
|
|
|
|
|
<![CDATA[
|
|
|
|
|
<?php
|
|
|
|
|
@@ -449,16 +451,16 @@ Fazendo um(a) tigela de iogurte natural de framboesa.
|
|
|
|
|
</example>
|
|
|
|
|
</para>
|
|
|
|
|
<para>
|
|
|
|
|
A partir do PHP 8.0.0, declarar argumentos obrigatórios após argumentos opcionais
|
|
|
|
|
A partir do PHP 8.0.0, declarar parâmetros obrigatórios após parâmetros opcionais
|
|
|
|
|
está <emphasis>descontinuado</emphasis>. Isso geralmente pode ser resolvido descartando
|
|
|
|
|
o valor padrão, pois nunca será usado.
|
|
|
|
|
Uma exceção a essa regra são argumentos no formato
|
|
|
|
|
Uma exceção a essa regra são parâmetros no formato
|
|
|
|
|
<code>Type $param = null</code>, onde o padrão &null; torna o tipo implicitamente
|
|
|
|
|
anulável. Este uso foi descontinuado a partir do PHP 8.4.0, e um
|
|
|
|
|
<link linkend="language.types.declarations.nullable">tipo anulável</link> explícito
|
|
|
|
|
deve ser usado.
|
|
|
|
|
<example>
|
|
|
|
|
<title>Declarando argumentos opcionais após argumentos obrigatórios</title>
|
|
|
|
|
<title>Declarando parâmetros opcionais após parâmetros obrigatórios</title>
|
|
|
|
|
<programlisting role="php">
|
|
|
|
|
<![CDATA[
|
|
|
|
|
<?php
|
|
|
|
|
@@ -486,7 +488,7 @@ function bar(?A $a, $b) {} // Recomendado
|
|
|
|
|
</note>
|
|
|
|
|
<note>
|
|
|
|
|
<simpara>
|
|
|
|
|
Argumentos passados por referência podem ter um valor padrão.
|
|
|
|
|
Parâmetros que esperam o argumento por referência podem ter um valor padrão.
|
|
|
|
|
</simpara>
|
|
|
|
|
</note>
|
|
|
|
|
</sect2>
|
|
|
|
|
@@ -501,10 +503,10 @@ function bar(?A $a, $b) {} // Recomendado
|
|
|
|
|
</simpara>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
Lista de argumentos que contém o token
|
|
|
|
|
<literal>...</literal> token para indicam que a função aceita uma
|
|
|
|
|
quantidade variável de argumentos. Os argumentos serão passados
|
|
|
|
|
na variável como um &array;:
|
|
|
|
|
Listas de parâmetros podem conter o token
|
|
|
|
|
<literal>...</literal> para indicar que a função aceita um
|
|
|
|
|
número variável de argumentos. Os argumentos serão passados
|
|
|
|
|
na variável informada como um &array;:
|
|
|
|
|
|
|
|
|
|
<example>
|
|
|
|
|
<title>Utilizando <literal>...</literal> para acessar argumentos variáveis</title>
|
|
|
|
|
@@ -564,20 +566,20 @@ echo add(...$a);
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
Você pode especificar argumentos posicionais antes do indicador.
|
|
|
|
|
Podem ser especificados parâmetros posicionais antes do indicador.
|
|
|
|
|
<literal>...</literal>. Nesse caso comente os argumentos finais,
|
|
|
|
|
que não pareiam com um argumento posicional, serão adicionados ao
|
|
|
|
|
array gerado por <literal>...</literal>.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
É também possível adicionar um
|
|
|
|
|
<link linkend="language.types.declarations">type hint</link> antes do indicador
|
|
|
|
|
<literal>...</literal>. Se presente então todos os argumentos
|
|
|
|
|
É também possível adicionar uma
|
|
|
|
|
<link linkend="language.types.declarations">dica de tipo</link> antes do indicador
|
|
|
|
|
<literal>...</literal>. Se presente, todos os argumentos
|
|
|
|
|
capturados por <literal>...</literal> deverão conformar com o tipo do parâmetro.
|
|
|
|
|
|
|
|
|
|
<example>
|
|
|
|
|
<title>Argumentos variáveis com type hint</title>
|
|
|
|
|
<title>Argumentos variáveis com dica de tipo</title>
|
|
|
|
|
<programlisting role="php">
|
|
|
|
|
<![CDATA[
|
|
|
|
|
<?php
|
|
|
|
|
@@ -593,7 +595,7 @@ $a = new DateInterval('P1D');
|
|
|
|
|
$b = new DateInterval('P2D');
|
|
|
|
|
echo total_intervals('d', $a, $b).' days';
|
|
|
|
|
|
|
|
|
|
// This will fail, since null isn't a DateInterval object.
|
|
|
|
|
// Isto falhará, já que null não é um objeto DateInterval.
|
|
|
|
|
echo total_intervals('d', null);
|
|
|
|
|
?>
|
|
|
|
|
]]>
|
|
|
|
|
@@ -609,7 +611,7 @@ Catchable fatal error: Argument 2 passed to total_intervals() must be an instanc
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
Finalmente, você também pode passar argumentos variáveis
|
|
|
|
|
Finalmente, também podem ser passados argumentos variáveis
|
|
|
|
|
<link linkend="functions.arguments.by-reference">por referência</link> ao
|
|
|
|
|
prefixar <literal>...</literal> com um
|
|
|
|
|
<literal>&</literal>.
|
|
|
|
|
@@ -629,9 +631,9 @@ Catchable fatal error: Argument 2 passed to total_intervals() must be an instanc
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
Argumentos nomeados são passados ao prefixar o valor um o nome do parâmetro
|
|
|
|
|
e um dois pontos. Usar palavras reservadas como nomes de parâmetro é permitido.
|
|
|
|
|
O nome de parâmetro precisa ser um identificados, e uma resolução dinâmica
|
|
|
|
|
Argumentos nomeados são passados ao prefixar o valor com o nome do parâmetro
|
|
|
|
|
e dois-pontos. Usar palavras reservadas como nomes de parâmetros é permitido.
|
|
|
|
|
O nome de parâmetro precisa ser um identificador, e uma resolução dinâmica
|
|
|
|
|
não é permitida.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
@@ -644,7 +646,7 @@ minhaFuncao(nomeParametro: $valor);
|
|
|
|
|
array_foobar(array: $value);
|
|
|
|
|
|
|
|
|
|
// NÃO suportado
|
|
|
|
|
nome_funcao($variaveoQueGuardaNomeDoParametro: $valor);
|
|
|
|
|
nome_funcao($variavelQueGuardaNomeDoParametro: $valor);
|
|
|
|
|
?>
|
|
|
|
|
]]>
|
|
|
|
|
</programlisting>
|
|
|
|
|
@@ -701,20 +703,24 @@ htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, 'UTF-8', fa
|
|
|
|
|
</example>
|
|
|
|
|
|
|
|
|
|
<para>
|
|
|
|
|
Passar o mesmo argumento mais de uma vez resulta em um Error.
|
|
|
|
|
Passar o mesmo argumento mais de uma vez resulta em Uma
|
|
|
|
|
exceção <classname>Error</classname>.
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<example>
|
|
|
|
|
<title>Erro lançado ao passar o mesmo argumento nomeado mais de uma vez</title>
|
|
|
|
|
<title>Erro lançado ao passar um argumento ao mesmo parâmetro nomeado múltiplas vezes</title>
|
|
|
|
|
<programlisting role="php">
|
|
|
|
|
<![CDATA[
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
function foo($param) { ... }
|
|
|
|
|
|
|
|
|
|
foo(param: 1, param: 2);
|
|
|
|
|
// Error: Named parameter $param overwrites previous argument
|
|
|
|
|
|
|
|
|
|
foo(1, param: 2);
|
|
|
|
|
// Error: Named parameter $param overwrites previous argument
|
|
|
|
|
|
|
|
|
|
?>
|
|
|
|
|
]]>
|
|
|
|
|
</programlisting>
|
|
|
|
|
@@ -1696,7 +1702,7 @@ $metodoPrivado(); // Foo1::metodoPrivado
|
|
|
|
|
|
|
|
|
|
<note>
|
|
|
|
|
<para>
|
|
|
|
|
A sintaxe de callable de primeira classe não pode ser combinada com o <link linkend="language.oop5.basic.nullsafe">operador nullsafe</link>. Ambos os resultados a seguir resultam em um erro de tempo de compilação:
|
|
|
|
|
A sintaxe de chamável de primeira classe não pode ser combinada com o <link linkend="language.oop5.basic.nullsafe">operador nullsafe</link>. Ambos os resultados a seguir resultam em um erro de tempo de compilação:
|
|
|
|
|
<informalexample>
|
|
|
|
|
<programlisting role="php">
|
|
|
|
|
<![CDATA[
|
|
|
|
|
|