mirror of
https://github.com/php/doc-pt_br.git
synced 2026-03-23 22:52:12 +01:00
sunc with en rev
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!-- EN-Revision: b1b039696eedcc82e9c1144eeecbfc0a8a1b3859 Maintainer: leonardolara Status: ready -->
|
||||
<?xml version="1.0" encoding="utf-8"?><!-- EN-Revision: 51f07182abc3960da16e611ae6f5636d7559b871 Maintainer: leonardolara Status: ready -->
|
||||
<sect1 xml:id="migration84.incompatible" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>Alterações Incompatíveis com Versões Anteriores</title>
|
||||
|
||||
@@ -359,6 +359,16 @@
|
||||
</para>
|
||||
</sect3>
|
||||
|
||||
<sect3 xml:id="migration84.incompatible.new-warnings-exceptions.session">
|
||||
<title>Session</title>
|
||||
|
||||
<simpara>
|
||||
Definir um valor não positivo para <link linkend="ini.session.gc-divisor">session.gc_divisor</link>
|
||||
ou um valor negativo para <link linkend="ini.session.gc-probability">session.gc_probability</link>
|
||||
agora emite um alerta.
|
||||
</simpara>
|
||||
</sect3>
|
||||
|
||||
<sect3 xml:id="migration84.incompatible.new-warnings-exceptions.simplexml">
|
||||
<title>SimpleXML</title>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- EN-Revision: be3338bf720808467447fdcdd6cab9d3e8d821bc Maintainer: ae Status: ready --><!-- CREDITS: felipeklerkyahoo.com.br,ae,geekcom,vanildosouto,leonardolara -->
|
||||
<!-- EN-Revision: 8d0b3a6ff0419e1d25384a942fd3d3dbcc2eb5f9 Maintainer: leonardolara Status: ready --><!-- CREDITS: felipeklerkyahoo.com.br,ae,geekcom,vanildosouto,leonardolara -->
|
||||
<appendix xml:id="resource" xmlns="http://docbook.org/ns/docbook">
|
||||
<title>Lista de tipos de recursos no PHP</title>
|
||||
<para>
|
||||
@@ -13,7 +13,7 @@
|
||||
<tgroup cols="5">
|
||||
<colspec colwidth='1*'/>
|
||||
<colspec colwidth='1*'/>
|
||||
<colspec colwidth='1.4*'/>
|
||||
<colspec colwidth='2*'/>
|
||||
<colspec colwidth='1*'/>
|
||||
<colspec colwidth='1*'/>
|
||||
<thead>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- EN-Revision: 9e2d8231b5d8a3795b365c6770fab288e59e6249 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
|
||||
<!-- EN-Revision: d35d7d811ccf7662eefe4f23ff1cabc727a917ca Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
|
||||
<chapter xml:id="features.dtrace" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>Instrumentação dimâmica DTrace</title>
|
||||
|
||||
@@ -11,32 +11,32 @@
|
||||
disponível em um número de plataformas incluindo Solaris, macOS,
|
||||
Oracle Linux e BSD. DTrace pode instrumentar comportamento do sistema operacional
|
||||
e execução de programa de usuário. Ele pode exibir valores de argumentos e ser
|
||||
usado para inferir estatísticas de desempenho. Os sensores são monitorados pos scripts
|
||||
usado para inferir estatísticas de desempenho. As sondas são monitorados pos scripts
|
||||
criados pelo usuário escritos na linguagem própria do DTrace (D). Isto
|
||||
permite uma análise eficiente de pontos de dados.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Sensores PHP que não estão monitorados ativamente por um script
|
||||
Sondas PHP que não estão monitorados ativamente por um script
|
||||
D do usuário não contêm código instrumentado, então não há
|
||||
degradação de desempenho durante a execução normal da aplicação.
|
||||
Sensores que estão sendo monitorados incorrem em uma sobrecarga pequena o suficiente
|
||||
Sondas que estão sendo monitoradas incorrem em uma sobrecarga pequena o suficiente
|
||||
para permitir monitoramento pelo DTrace em sistemas ativos em fase de produção.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
PHP incorpora sensores com "Instrumentação Estaticamente Definida no Nível de Usuário" (USDT em inglês)
|
||||
que são ativados em tempo de execução. Por exemplo, quando um script D
|
||||
está monitorando o sensor de <literal>function-entry</literal> do PHP, então
|
||||
a cada momento que uma função do PHP é chamada, este sensor é disparado e
|
||||
PHP incorpora sondas com "Instrumentação Estaticamente Definida no Nível de Usuário" (USDT em inglês)
|
||||
que são ativadas em tempo de execução. Por exemplo, quando um script D
|
||||
está monitorando a sonda de <literal>function-entry</literal> do PHP,
|
||||
a cada momento que uma função do PHP é chamada, esta sonda é disparada e
|
||||
o código de ação do script D associado é executado. Este código de ação
|
||||
poderia, por exemplo, imprimir argumentos de sensor como a localização do arquivo-fonte
|
||||
poderia, por exemplo, imprimir argumentos de sonda como a localização do arquivo-fonte
|
||||
da função PHP. Ou a ação poderia agregar dados como
|
||||
o númedo de vezes que cada função é chamada.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Apenas os sensores USDT do PHP são descritas aqui. Refira-se à literatura externa do Dtrace,
|
||||
Apenas as sondas USDT do PHP são descritas aqui. Refira-se à literatura externa do Dtrace,
|
||||
tanto geral quanto específica do sistema operacional, para entender como
|
||||
o DTrace pode ser usado para instrumentar funções arbitrárias, e como ele pode ser
|
||||
usado para instrumentar comportamento do sistema operacional. Note que nem todas as
|
||||
@@ -44,7 +44,7 @@
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Os sensores estáticos do Dtrace no PHP podem alternativamente ser utilizados com a
|
||||
As sondas estáticas do Dtrace no PHP podem alternativamente ser utilizadas com a
|
||||
ferramenta SystemTap de algumas distribuições Linux.
|
||||
</para>
|
||||
</sect1>
|
||||
@@ -52,12 +52,12 @@
|
||||
<sect1 xml:id="features.dtrace.dtrace">
|
||||
<title>Usando PHP e DTrace</title>
|
||||
<para>
|
||||
O PHP pode ser configuracom com sensores estáticos do DTrace em plataformas que
|
||||
O PHP pode ser configurado com sondas estáticas do DTrace em plataformas que
|
||||
suportam a Instrumentação Dinâmica do DTrace.
|
||||
</para>
|
||||
|
||||
<sect2 xml:id="features.dtrace.install">
|
||||
<title>Configurando o PHP para Sensores Estáticos DTrace</title>
|
||||
<title>Configurando o PHP para Sondas Estáticas DTrace</title>
|
||||
|
||||
<para>
|
||||
Refira-se à documentação externa específica da plataforma para habilitar
|
||||
@@ -91,22 +91,25 @@
|
||||
</informalexample>
|
||||
</para>
|
||||
<para>
|
||||
Isto habilita sensores estáticos no núcleo do PHP. Quaisquer extensões PHP
|
||||
que fornecem seus próprios sensores devem ser construídas separadamente como
|
||||
Isto faz com que as sondas estáticas estejam disponíveis no núcleo do PHP. Quaisquer extensões PHP
|
||||
que fornecem seus próprios sondas devem ser construídas separadamente como
|
||||
extensões compartilhadas.
|
||||
</para>
|
||||
<para>
|
||||
Para habilitar as sondas, defina a variável de ambiente <option>USE_ZEND_DTRACE=1</option> para os processos alvos do PHP.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="features.dtrace.static-probes">
|
||||
<title>Sensores Estáticos DTrace no Núcleo do PHP</title>
|
||||
<title>Sondas Estáticos DTrace no Núcleo do PHP</title>
|
||||
<table>
|
||||
<title>Os sensores estáticos a seguir estão disponíveis no PHP</title>
|
||||
<title>As sondas estáticos a seguir estão disponíveis no PHP</title>
|
||||
<tgroup cols="2">
|
||||
<thead>
|
||||
<row>
|
||||
<entry>Nome do Sensor</entry>
|
||||
<entry>Descrição do Sensor</entry>
|
||||
<entry>Argumentos do Sensor</entry>
|
||||
<entry>Nome da Sonda</entry>
|
||||
<entry>Descrição da Sonda</entry>
|
||||
<entry>Argumentos da Sonda</entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -171,14 +174,14 @@
|
||||
</tgroup>
|
||||
</table>
|
||||
<para>
|
||||
Extensões de PHP podem também conter sensores estáticos adicionais.
|
||||
Extensões de PHP podem também conter sondas estáticas adicionais.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="features.dtrace.list-probes">
|
||||
<title>Listando os Sensores Estáticos DTrace no PHP</title>
|
||||
<title>Listando As Sondas Estáticas DTrace no PHP</title>
|
||||
<para>
|
||||
Para listar os sensores disponíveis, inicie um processo PHP e então execute:
|
||||
Para listar as sondas disponíveis, inicie um processo PHP e então execute:
|
||||
<informalexample>
|
||||
<programlisting>
|
||||
<![CDATA[
|
||||
@@ -230,7 +233,7 @@
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Se um processo PHP não estiver em execução, então nenhum sensor PHP será mostrado.
|
||||
Se um processo PHP não estiver em execução, então nenhuma sonda PHP será mostrada.
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
@@ -239,7 +242,7 @@
|
||||
<para>
|
||||
Este exemplo mostra o básico da linguagem D de scripts DTrace.
|
||||
<example>
|
||||
<title>Arquivo <filename>all_probes.d</filename> para instrumentar todos os Sensores Estáticos PHP com DTrace</title>
|
||||
<title>Arquivo <filename>all_probes.d</filename> para instrumentar todas as Sondas Estáticas do PHP com DTrace</title>
|
||||
<programlisting>
|
||||
<![CDATA[
|
||||
#!/usr/sbin/dtrace -Zs
|
||||
@@ -338,12 +341,12 @@ php*:::request-startup
|
||||
Este script usa a opção <literal>-Z</literal> para a aplicação
|
||||
<filename>dtrace</filename>, permitindo que ela seja executada quando não
|
||||
há processo PHP em execução. Se esta opção fosse omitida, o script
|
||||
iria terminar imediatamente porque ele saberia que nenhum dos sensores
|
||||
a serem monitorados existiriam.
|
||||
iria terminar imediatamente porque ele saberia que nenhuma das sondas
|
||||
a serem monitoradas existiriam.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
O script instrumenta todos os pontos de sensores estáticos do núcleo do PHP durante toda a
|
||||
O script instrumenta todos os pontos de sondas estáticas do núcleo do PHP durante toda a
|
||||
duração de um script PHP em execução. Execute o script D:
|
||||
<informalexample>
|
||||
<programlisting>
|
||||
@@ -356,7 +359,7 @@ php*:::request-startup
|
||||
|
||||
<para>
|
||||
Executa um script PHP ou aplicação. O script D de monitoramento terá
|
||||
como saída os argumentos de cada um dos sensores quando for disparado.
|
||||
como saída os argumentos de cada uma das sondas quando for disparado.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -365,9 +368,9 @@ php*:::request-startup
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Em máquinas com múltiplas CPUs, pode parecer que os sensor estão em ordem
|
||||
não sequencial. Isto depende de qual CPU está processando os sensores,
|
||||
e como as threads migram atráves dos CPUs. Mostrar os timestamps dos sensores
|
||||
Em máquinas com múltiplas CPUs, pode parecer que as sondas estão em ordem
|
||||
não sequencial. Isto depende de qual CPU está processando as sondas,
|
||||
e como as threads migram atráves dos CPUs. Mostrar os timestamps das sondas
|
||||
irá ajudar a reduzir a confusão, por exemplo:
|
||||
<informalexample>
|
||||
<programlisting>
|
||||
@@ -392,10 +395,10 @@ php*:::function-entry
|
||||
</sect1>
|
||||
|
||||
<sect1 xml:id="features.dtrace.systemtap">
|
||||
<title>Usando SystemTap com Sensores Estáticos DTrace</title>
|
||||
<title>Usando SystemTap com Sondas Estáticas DTrace</title>
|
||||
<para>
|
||||
Em algumas distribuições Linux, o utilitário SystemTap de instrumentação pode ser
|
||||
usado para instrumentar sensores estáticos do PHP. Isso está disponível no
|
||||
usado para instrumentar sondas estáticas do PHP. Isso está disponível no
|
||||
PHP 5.4.20 e PHP 5.5.
|
||||
</para>
|
||||
|
||||
@@ -414,7 +417,7 @@ php*:::function-entry
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Instale o PHP com os sensores DTrace habilitados:
|
||||
Instale o PHP com as sondas DTrace habilitadas:
|
||||
<informalexample>
|
||||
<programlisting role="shell">
|
||||
<![CDATA[
|
||||
@@ -427,10 +430,10 @@ php*:::function-entry
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="features.dtrace.systemtap-list-probes">
|
||||
<title>Listando os Sensores Estáticos com SystemTap</title>
|
||||
<title>Listando as Sondas Estáticas com SystemTap</title>
|
||||
|
||||
<para>
|
||||
Os sensores estáticos em PHP podem ser listados usando <filename>stap</filename>:
|
||||
As sondas estáticas em PHP podem ser listados usando <filename>stap</filename>:
|
||||
<informalexample>
|
||||
<programlisting>
|
||||
<![CDATA[
|
||||
@@ -467,7 +470,7 @@ process("sapi/cli/php").provider("php").mark("request__startup")
|
||||
|
||||
<para>
|
||||
<example>
|
||||
<title><filename>all_probes.stp</filename> para instrumentação de todos os Sensores Estáticos do PHP com SystemTap</title>
|
||||
<title><filename>all_probes.stp</filename> para instrumentação de todos as Sondas Estáticas do PHP com SystemTap</title>
|
||||
<programlisting role="shell">
|
||||
<![CDATA[
|
||||
probe process("sapi/cli/php").provider("php").mark("compile__file__entry") {
|
||||
@@ -537,7 +540,7 @@ probe process("sapi/cli/php").provider("php").mark("request__startup") {
|
||||
</example>
|
||||
</para>
|
||||
<para>
|
||||
O script acima irá instrumentar todos os pontos de sensores estáticos do núcleo do PHP
|
||||
O script acima irá instrumentar todos os pontos de sondas estáticas do núcleo do PHP
|
||||
durante toda a duração de um script PHP em execução:
|
||||
<informalexample>
|
||||
<programlisting>
|
||||
|
||||
@@ -1,22 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- EN-Revision: e49940b757b35b8ef26bb64380c231eda7b49fc4 Maintainer: lhsazevedo Status: ready --><!-- CREDITS: fabioluciano,geekcom,lhsazevedo -->
|
||||
|
||||
<!-- EN-Revision: 44ae7cb94991c11c93bc23f8a6544f81bb36cf1a Maintainer: leonardolara Status: ready --><!-- CREDITS: fabioluciano,geekcom,lhsazevedo,leonardolara -->
|
||||
<sect1 xml:id="control-structures.foreach" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>foreach</title>
|
||||
<?phpdoc print-version-for="foreach"?>
|
||||
<para>
|
||||
O construtor <literal>foreach</literal> fornece uma maneira fácil de
|
||||
iterar sobre arrays. O <literal>foreach</literal> funciona somente em arrays
|
||||
e objetos, e emitirá um erro ao tentar usá-lo em uma variável
|
||||
com um tipo de dado diferente ou em uma variável não inicializada. Possui
|
||||
duas sintaxes:
|
||||
iterar sobre <type>array</type>s e objetos <interfacename>Traversable</interfacename>.
|
||||
O <literal>foreach</literal> emitirá um erro quando usado com
|
||||
uma variável contendo um tipo de dado diferente ou com uma variável não inicializada.
|
||||
<informalexample>
|
||||
<simpara>
|
||||
<literal>foreach</literal> pode, opcionalmente, obter a chave (<literal>key</literal>) de cada elemento:
|
||||
</simpara>
|
||||
<programlisting>
|
||||
<![CDATA[
|
||||
foreach (iterable_expression as $valor)
|
||||
statement
|
||||
foreach (iterable_expression as $chave => $valor)
|
||||
statement
|
||||
foreach (expressão_iterável as $valor) {
|
||||
lista_de_instruções
|
||||
}
|
||||
|
||||
foreach (expressão_iterável as $chave => $valor) {
|
||||
lista_de_instruções
|
||||
}
|
||||
]]>
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
@@ -40,160 +44,88 @@ foreach (iterable_expression as $chave => $valor)
|
||||
<link linkend="language.oop5.iterations">customizar a iteração em objetos</link>.
|
||||
</simpara>
|
||||
|
||||
<para>
|
||||
Para modificar diretamente elementos de um array dentro de um laço, preceda
|
||||
<literal>$valor</literal> com &. Neste caso, o valor será atribuído por
|
||||
<link linkend="language.references">referência</link>.
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
<example>
|
||||
<title>Usos comuns de <literal>foreach</literal></title>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
<?php
|
||||
$arr = array(1, 2, 3, 4);
|
||||
foreach ($arr as &$valor) {
|
||||
$valor = $valor * 2;
|
||||
}
|
||||
// $arr agora é array(2, 4, 6, 8)
|
||||
unset($valor); // quebra a referência com o último elemento
|
||||
?>
|
||||
]]>
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
</para>
|
||||
<warning>
|
||||
<para>
|
||||
A referência ao <literal>$valor</literal> e o último elemento do array
|
||||
permanecerá inalterado mesmo após a iteração do <literal>foreach</literal>.
|
||||
É recomendado destruí-lo utilizando a função <function>unset</function>.
|
||||
Caso contrário você experienciará o seguinte comportamento:
|
||||
</para>
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
<?php
|
||||
$arr = array(1, 2, 3, 4);
|
||||
foreach ($arr as &$valor) {
|
||||
$valor = $valor * 2;
|
||||
}
|
||||
// $arr agora é array(2, 4, 6, 8)
|
||||
/* Examplo: somente valor */
|
||||
|
||||
// sem um unset($valor), $valor continuará como referência ao último item: $arr[3]
|
||||
$array = [1, 2, 3, 17];
|
||||
|
||||
foreach ($arr as $chave => $valor) {
|
||||
// $arr[3] será atualizado com cada valor de $arr...
|
||||
echo "{$chave} => {$valor} ";
|
||||
print_r($arr);
|
||||
}
|
||||
// ...até que, o segundo e último valor é copiado para o último valor
|
||||
|
||||
// saída:
|
||||
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
|
||||
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
|
||||
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
|
||||
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
|
||||
?>
|
||||
]]>
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
</warning>
|
||||
<para>
|
||||
É possível iterar o valor de um array constante por referência
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
<?php
|
||||
foreach (array(1, 2, 3, 4) as &$valor) {
|
||||
$valor = $valor * 2;
|
||||
}
|
||||
?>
|
||||
]]>
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
</para>
|
||||
<para>
|
||||
<note>
|
||||
<para>
|
||||
O <literal>foreach</literal> não possui suporte a habilidade
|
||||
de suprimir mensagens de erro utilizando
|
||||
<literal linkend="language.operators.errorcontrol">@</literal>.
|
||||
</para>
|
||||
</note>
|
||||
</para>
|
||||
<para>
|
||||
Mais alguns exemplos para demonstrar o uso:
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
<?php
|
||||
/* Exemplo foreach1: somente valores */
|
||||
|
||||
$a = array(1, 2, 3, 17);
|
||||
|
||||
foreach ($a as $v) {
|
||||
echo "Valor atual de \$a: $v.\n";
|
||||
foreach ($array as $value) {
|
||||
echo "Elemento atual de \$array: $value.\n";
|
||||
}
|
||||
|
||||
/* Exemplo foreach 2: valor com acesso manual (apenas ilustrativo) */
|
||||
/* Examplo: chave e valor */
|
||||
|
||||
$a = array(1, 2, 3, 17);
|
||||
|
||||
$i = 0; /* apenas para ilustrar */
|
||||
|
||||
foreach ($a as $v) {
|
||||
echo "\$a[$i] => $v.\n";
|
||||
$i++;
|
||||
}
|
||||
|
||||
/* Exemplo foreach 3: chave e valor */
|
||||
|
||||
$a = array(
|
||||
$array = [
|
||||
"um" => 1,
|
||||
"dois" => 2,
|
||||
"três" => 3,
|
||||
"dezessete" => 17
|
||||
);
|
||||
];
|
||||
|
||||
foreach ($a as $k => $v) {
|
||||
echo "\$a[$k] => $v.\n";
|
||||
foreach ($array as $key => $value) {
|
||||
echo "Chave: $key => Valor: $value\n";
|
||||
}
|
||||
|
||||
/* Exemplo foreach 4: arrays multi dimensionais */
|
||||
$a = array();
|
||||
$a[0][0] = "a";
|
||||
$a[0][1] = "b";
|
||||
$a[1][0] = "y";
|
||||
$a[1][1] = "z";
|
||||
/* Examplo: arrays chave-valor multidimensionais */
|
||||
$grid = [];
|
||||
$grid[0][0] = "a";
|
||||
$grid[0][1] = "b";
|
||||
$grid[1][0] = "y";
|
||||
$grid[1][1] = "z";
|
||||
|
||||
foreach ($a as $v1) {
|
||||
foreach ($v1 as $v2) {
|
||||
echo "$v2\n";
|
||||
foreach ($grid as $y => $row) {
|
||||
foreach ($row as $x => $value) {
|
||||
echo "Valor na posição x=$x e y=$y: $value\n";
|
||||
}
|
||||
}
|
||||
|
||||
/* Exemplo foreach 5: arrays dinâmicos */
|
||||
/* Examplo: arrays dinâmicos */
|
||||
|
||||
foreach (array(1, 2, 3, 4, 5) as $v) {
|
||||
echo "$v\n";
|
||||
foreach (range(1, 5) as $value) {
|
||||
echo "$value\n";
|
||||
}
|
||||
?>
|
||||
]]>
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
</para>
|
||||
</programlisting>
|
||||
</example>
|
||||
<note>
|
||||
<para>
|
||||
<literal>foreach</literal> não suporta a capacidade de
|
||||
supressão de mensagens de erro usando o operador
|
||||
<link linkend="language.operators.errorcontrol"><literal>@</literal></link>.
|
||||
</para>
|
||||
</note>
|
||||
|
||||
<sect2 xml:id="control-structures.foreach.list">
|
||||
<title>Desempacotando arrays aninhados com o construtor list()</title>
|
||||
<title>Desempacotando arrays aninhados</title>
|
||||
<?phpdoc print-version-for="foreach.list"?>
|
||||
|
||||
<para>
|
||||
É possível iterar sobre um array de arrays e desempacotar
|
||||
arrays aninhados em variáveis do laço fornecendo o construtor <function>list</function>
|
||||
como valor.
|
||||
É possível iterar sobre um array de arrays e desempacotar o array aninhado
|
||||
em variáveis do laço usando
|
||||
<link linkend="language.types.array.syntax.destructuring">desestruturação de array</link>
|
||||
através de <literal>[]</literal> ou usando o contrutor de linguagem <function>list</function>
|
||||
como o valor.
|
||||
|
||||
<note>
|
||||
<simpara>
|
||||
Observe que
|
||||
<link linkend="language.types.array.syntax.destructuring">desestruturação de array</link>
|
||||
através de <literal>[]</literal> só é possível a partir do PHP 7.1.0.
|
||||
</simpara>
|
||||
</note>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Por exemplo:
|
||||
|
||||
<informalexample>
|
||||
<simpara>
|
||||
Em ambos os exemplos a seguir, <literal>$a</literal> será definida para
|
||||
o primeiro elemento do array aninhado e <literal>$b</literal>
|
||||
conterá o segundo elemento:
|
||||
</simpara>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
<?php
|
||||
@@ -202,9 +134,11 @@ $array = [
|
||||
[3, 4],
|
||||
];
|
||||
|
||||
foreach ($array as [$a, $b]) {
|
||||
echo "A: $a; B: $b\n";
|
||||
}
|
||||
|
||||
foreach ($array as list($a, $b)) {
|
||||
// $a contém o primeiro elemento do array aninhado,
|
||||
// e $b contém o segundo elemento.
|
||||
echo "A: $a; B: $b\n";
|
||||
}
|
||||
?>
|
||||
@@ -221,22 +155,26 @@ A: 3; B: 4
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Pode-se se fornecer menos elementos ao construtor <function>list</function> aos que
|
||||
existem no array aninhado, neste caso, os valores do array que sobrarem serão
|
||||
ignorados.
|
||||
|
||||
Ao fornecer menos variáveis que o número de elementos no array,
|
||||
os elementos restantes serão ignorados.
|
||||
Da mesma forma, elementos podem ser pulados usando uma vírgula:
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
<?php
|
||||
$array = [
|
||||
[1, 2],
|
||||
[3, 4],
|
||||
[1, 2, 3],
|
||||
[3, 4, 6],
|
||||
];
|
||||
|
||||
foreach ($array as list($a)) {
|
||||
// Veja que não existe $b aqui.
|
||||
echo "$a\n";
|
||||
foreach ($array as [$a, $b]) {
|
||||
// Observe que não existe $c aqui.
|
||||
echo "$a $b\n";
|
||||
}
|
||||
|
||||
foreach ($array as [, , $c]) {
|
||||
// Pulando $a e $b
|
||||
echo "$c\n";
|
||||
}
|
||||
?>
|
||||
]]>
|
||||
@@ -244,8 +182,10 @@ foreach ($array as list($a)) {
|
||||
&example.outputs;
|
||||
<screen>
|
||||
<![CDATA[
|
||||
1
|
||||
3
|
||||
1 2
|
||||
3 4
|
||||
5
|
||||
6
|
||||
]]>
|
||||
</screen>
|
||||
</informalexample>
|
||||
@@ -264,7 +204,7 @@ $array = [
|
||||
[3, 4],
|
||||
];
|
||||
|
||||
foreach ($array as list($a, $b, $c)) {
|
||||
foreach ($array as [$a, $b, $c]) {
|
||||
echo "A: $a; B: $b; C: $c\n";
|
||||
}
|
||||
?>
|
||||
@@ -273,7 +213,6 @@ foreach ($array as list($a, $b, $c)) {
|
||||
&example.outputs;
|
||||
<screen>
|
||||
<![CDATA[
|
||||
|
||||
Notice: Undefined offset: 2 in example.php on line 7
|
||||
A: 1; B: 2; C:
|
||||
|
||||
@@ -285,6 +224,90 @@ A: 3; B: 4; C:
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="control-structures.foreach.reference">
|
||||
<title>foreach e referências</title>
|
||||
<para>
|
||||
É possível modificar elementos de array diretamente dentro de um laço precedendo
|
||||
<literal>$value</literal> com <literal>&</literal>.
|
||||
Neste caso, o valor será atribuído por
|
||||
<link linkend="language.references">referência</link>.
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
<?php
|
||||
$arr = [1, 2, 3, 4];
|
||||
foreach ($arr as &$value) {
|
||||
$value = $value * 2;
|
||||
}
|
||||
// $arr agora é [2, 4, 6, 8]
|
||||
unset($value); // quebra a referência com o último elemento
|
||||
?>
|
||||
]]>
|
||||
</programlisting>
|
||||
</informalexample>
|
||||
</para>
|
||||
<warning>
|
||||
<simpara>
|
||||
A referência a um <literal>$value</literal> do último elemento do array
|
||||
permanece mesmo depois do laço <literal>foreach</literal>. É recomendado
|
||||
destruir essas referências usando <function>unset</function>.
|
||||
Caso contrário, o comportamento a seguir irá ocorrer:
|
||||
</simpara>
|
||||
<informalexample>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
<?php
|
||||
$arr = [1, 2, 3, 4];
|
||||
foreach ($arr as &$value) {
|
||||
$value = $value * 2;
|
||||
}
|
||||
// $arr agora é [2, 4, 6, 8]
|
||||
|
||||
// sem um unset($value), $value ainda é uma referência ao último item: $arr[3]
|
||||
|
||||
foreach ($arr as $key => $value) {
|
||||
// $arr[3] será atualizado com cada valor de $arr...
|
||||
echo "{$key} => {$value} ";
|
||||
print_r($arr);
|
||||
}
|
||||
// ...até finalmente o penúltimo valor ser copiado no último valor
|
||||
?>
|
||||
]]>
|
||||
</programlisting>
|
||||
&example.outputs;
|
||||
<screen>
|
||||
<![CDATA[
|
||||
0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
|
||||
1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
|
||||
2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
|
||||
3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
|
||||
]]>
|
||||
</screen>
|
||||
</informalexample>
|
||||
</warning>
|
||||
<example>
|
||||
<title>Iterando valores de um array constante por referência</title>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
<?php
|
||||
foreach ([1, 2, 3, 4] as &$value) {
|
||||
$value = $value * 2;
|
||||
}
|
||||
?>
|
||||
]]>
|
||||
</programlisting>
|
||||
</example>
|
||||
</sect2>
|
||||
|
||||
<sect2 role="seealso">
|
||||
&reftitle.seealso;
|
||||
<simplelist>
|
||||
<member><link linkend="language.types.array">array</link></member>
|
||||
<member><interfacename>Traversable</interfacename></member>
|
||||
<member><link linkend="language.types.iterable">iterable</link></member>
|
||||
<member><function>list</function></member>
|
||||
</simplelist>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
<!-- Keep this comment at the end of the file
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- EN-Revision: f4f96ef8b2a95283c92ea2183fe1dedf06f3ad22 Maintainer: leonardolara Status: ready --><!-- CREDITS: narigone,felipe,ae,geekcom,leonardolara -->
|
||||
<!-- EN-Revision: 844190217fcb8ad1d0790ef5a90f7c18fa9d1a9d Maintainer: leonardolara Status: ready --><!-- CREDITS: narigone,felipe,ae,geekcom,leonardolara -->
|
||||
<chapter xml:id="language.exceptions" xmlns="http://docbook.org/ns/docbook">
|
||||
<title>Exceções</title>
|
||||
<para>
|
||||
@@ -325,16 +325,26 @@ try {
|
||||
?>
|
||||
]]>
|
||||
</programlisting>
|
||||
&example.outputs;
|
||||
<screen>
|
||||
<![CDATA[
|
||||
Uma exceção SpecificException foi lançada, mas os detalhes não importam.
|
||||
]]>
|
||||
</screen>
|
||||
</example>
|
||||
<example>
|
||||
<title>Throw as an expression</title>
|
||||
<para>Only permitted in PHP 8.0.0 and later.</para>
|
||||
<title>Throw como uma expressão</title>
|
||||
<para>Permitido apenas no PHP 8.0.0 e posteriores.</para>
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
<?php
|
||||
|
||||
function test() {
|
||||
do_something_risky() or throw new Exception('It did not work');
|
||||
do_something_risky() or throw new Exception('Não funcionou');
|
||||
}
|
||||
|
||||
function do_something_risky() {
|
||||
return false; // Simula falha
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -345,6 +355,12 @@ try {
|
||||
?>
|
||||
]]>
|
||||
</programlisting>
|
||||
&example.outputs;
|
||||
<screen>
|
||||
<![CDATA[
|
||||
Não funcionou
|
||||
]]>
|
||||
</screen>
|
||||
</example>
|
||||
</sect1>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- EN-Revision: c0fa5077c8862405942d8aac7360c5169558b59b Maintainer: adiel Status: ready --><!-- CREDITS: fabioluciano, rogeriopradoj, adiel -->
|
||||
<!-- EN-Revision: 6a3ce2f9a191ad00fdd709c249e6dea16df316e3 Maintainer: leonardolara Status: ready --><!-- CREDITS: fabioluciano, rogeriopradoj, adiel, leonardolara -->
|
||||
<sect1 xml:id="language.oop5.changelog" xmlns="http://docbook.org/ns/docbook">
|
||||
<title>Lista de alterações da POO</title>
|
||||
<para>
|
||||
@@ -16,6 +16,12 @@
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>8.4.0</entry>
|
||||
<entry>
|
||||
Adicionado: suporte para <link linkend="language.oop5.property-hooks">Ganchos de Propriedade</link>.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>8.4.0</entry>
|
||||
<entry>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- EN-Revision: 460f49a93d103cac99556147cb9325b095ca3d42 Maintainer: ae Status: ready --><!-- CREDITS: royopa,ae -->
|
||||
<!-- EN-Revision: 63b48309213faf184b4c2b6333e19675654aa473 Maintainer: leonardolara Status: ready --><!-- CREDITS: royopa,ae,leonardolara -->
|
||||
<refentry xml:id="iteratoraggregate.getiterator" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<refnamediv>
|
||||
<refname>IteratorAggregate::getIterator</refname>
|
||||
<refpurpose>Recupera um iterator externo</refpurpose>
|
||||
<refpurpose>Recupera um iterador ou Traversable externo</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsect1 role="description">
|
||||
@@ -13,7 +13,7 @@
|
||||
<void/>
|
||||
</methodsynopsis>
|
||||
<para>
|
||||
Retorna um iterator externo.
|
||||
Retorna um iterador ou Traversable externo.
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- EN-Revision: fd65805e83f7dc3b12ab5844cafc4489dc367a27 Maintainer: ae Status: ready --><!-- CREDITS: surfmax,felipe,ae,leonardolara -->
|
||||
<!-- EN-Revision: c558c3af38874a913c7515bbd49aaf2e689cbdd0 Maintainer: leonardolara Status: ready --><!-- CREDITS: surfmax,felipe,ae,leonardolara -->
|
||||
<refentry xml:id="function.is-a" xmlns="http://docbook.org/ns/docbook">
|
||||
<refnamediv>
|
||||
<refname>is_a</refname>
|
||||
@@ -88,6 +88,15 @@ if (is_a($WF, 'WidgetFactory')) {
|
||||
<programlisting role="php">
|
||||
<![CDATA[
|
||||
<?php
|
||||
// define uma classe
|
||||
class WidgetFactory
|
||||
{
|
||||
var $oink = 'moo';
|
||||
}
|
||||
|
||||
// cria um novo objeto
|
||||
$WF = new WidgetFactory();
|
||||
|
||||
if ($WF instanceof WidgetFactory) {
|
||||
echo "\$WF implementa WidgetFactory\n";
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- EN-Revision: 5bc68add3da3cd18c40f851e944b15095d3a26aa Maintainer: marcosmarcolin Status: ready --><!-- CREDITS: marcosmarcolin, leonardolara -->
|
||||
<!-- EN-Revision: 9dadf74254fa743db43e73ab3f5a3d441c271ab1 Maintainer: leonardolara Status: ready --><!-- CREDITS: marcosmarcolin, leonardolara -->
|
||||
<refentry xml:id="mysqli.construct" xmlns="http://docbook.org/ns/docbook">
|
||||
<refnamediv>
|
||||
<refname>mysqli::__construct</refname>
|
||||
@@ -123,6 +123,11 @@
|
||||
|
||||
<refsect1 role="returnvalues">
|
||||
&reftitle.returnvalues;
|
||||
<para>
|
||||
<methodname>mysqli::__construct</methodname> sempre retorna um objeto
|
||||
que representa a conexão a um servidor MySQL,
|
||||
independente se teve sucesso ou não.
|
||||
</para>
|
||||
<para>
|
||||
<function>mysqli_connect</function> retorna um objeto que representa a conexão com um servidor MySQL,
|
||||
&return.falseforfailure;.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- EN-Revision: 8a058e9acded067eaa1bd445ed6943158e7311df Maintainer: adiel Status: ready --><!-- CREDITS: adiel -->
|
||||
<!-- EN-Revision: b3d09b7bb4513a6fc08c9adf8793929cb283acc6 Maintainer: leonardolara Status: ready --><!-- CREDITS: adiel, leonardolara -->
|
||||
<section xml:id="pdo.installation" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
&reftitle.install;
|
||||
<procedure xml:id="pdo.install.unix51up">
|
||||
@@ -26,13 +26,13 @@
|
||||
Ao instalar o PDO como um módulo compartilhado, o arquivo php.ini precisa
|
||||
ser atualizado para que a extensão PDO seja carregada automaticamente quando o PHP for executado.
|
||||
Qualquer driver de banco de dados usado também precisará ser habilitado;
|
||||
certifique-se de que eles estejam listados após a linha pdo.so, pois o PDO deve
|
||||
certifique-se de que eles estejam listados após a linha extension=pdo, pois o PDO deve
|
||||
ser inicializado antes que as extensões específicas do banco de dados possam ser carregadas.
|
||||
Se o PDO e as extensões de banco de dados foram compilados estaticamente,
|
||||
esta etapa pode ser ignorada.
|
||||
<screen>
|
||||
<![CDATA[
|
||||
extension=pdo.so
|
||||
extension=pdo
|
||||
]]>
|
||||
</screen>
|
||||
</para>
|
||||
@@ -42,21 +42,16 @@ extension=pdo.so
|
||||
<title>Pessoas usuárias do Windows</title>
|
||||
<step>
|
||||
<para>
|
||||
PDO é habilitado por padrão.
|
||||
Selecione os outros arquivos DLL e use a função
|
||||
<function>dl</function> para carregá-los em tempo de execução ou habilite-os no arquivo
|
||||
&php.ini; abaixo de <filename>php_pdo.dll</filename>. Por exemplo:
|
||||
&php.ini;. Por exemplo, isto carrega o driver
|
||||
<link linkend="ref.pdo-sqlite">PDO_SQLITE</link> mas
|
||||
deixa o driver <link linkend="ref.pdo-odbc">PDO_ODBC</link> comentado:
|
||||
<screen>
|
||||
<![CDATA[
|
||||
extension=php_pdo.dll
|
||||
extension=php_pdo_firebird.dll
|
||||
extension=php_pdo_informix.dll
|
||||
extension=php_pdo_mssql.dll
|
||||
extension=php_pdo_mysql.dll
|
||||
extension=php_pdo_oci.dll
|
||||
extension=php_pdo_oci8.dll
|
||||
extension=php_pdo_odbc.dll
|
||||
extension=php_pdo_pgsql.dll
|
||||
extension=php_pdo_sqlite.dll
|
||||
;extension=pdo_odbc
|
||||
extension=pdo_sqlite
|
||||
]]>
|
||||
</screen>
|
||||
</para>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- EN-Revision: c477749c82111cbbdd657a0e98eeaeeec0d90c91 Maintainer: leonardolara Status: ready --><!-- CREDITS: adiel,fernandowobeto,leonardolara -->
|
||||
<!-- EN-Revision: e0e74c05cb704b614ff6925552884fbffb26bb53 Maintainer: leonardolara Status: ready --><!-- CREDITS: adiel,fernandowobeto,leonardolara -->
|
||||
|
||||
<book xml:id="book.reflection" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<?phpdoc extension-membership="core" ?>
|
||||
@@ -50,6 +50,7 @@
|
||||
&reference.reflection.reflectionattribute;
|
||||
&reference.reflection.reflector;
|
||||
&reference.reflection.reflectionexception;
|
||||
&reference.reflection.propertyhooktype;
|
||||
|
||||
</book>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- EN-Revision: 16f66c05a4060a7d673ae1c70b656d65009407b0 Maintainer: fernandowobeto Status: ready --><!-- CREDITS: fernandowobeto, leonardolara -->
|
||||
<!-- EN-Revision: e0e74c05cb704b614ff6925552884fbffb26bb53 Maintainer: leonardolara Status: ready --><!-- CREDITS: fernandowobeto, leonardolara -->
|
||||
<refentry xml:id="reflectionproperty.ispublic" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<refnamediv>
|
||||
<refname>ReflectionProperty::isPublic</refname>
|
||||
@@ -34,12 +34,29 @@
|
||||
</note>
|
||||
</refsect1>
|
||||
|
||||
<refsect1 role="notes">
|
||||
&reftitle.notes;
|
||||
<note>
|
||||
<simpara>
|
||||
Observe que uma propriedade sendo <literal>public</literal> nem sempre
|
||||
implica que ela é publicamente modificável. Uma propriedade poderia ser virtual sem nenhum
|
||||
gancho <literal>set</literal>, ou porderia ser <literal>readonly</literal>
|
||||
e já ter sido modificada, ou poderia ter a
|
||||
<link linkend="language.oop5.visibility-members-aviz">visibuilidade <literal>set</literal>
|
||||
definida</link> que é não-pública. Em todos estes casos,
|
||||
este método retornará &true; mas a propriedade não será modificável.
|
||||
</simpara>
|
||||
</note>
|
||||
</refsect1>
|
||||
|
||||
<refsect1 role="seealso">
|
||||
&reftitle.seealso;
|
||||
<para>
|
||||
<simplelist>
|
||||
<member><methodname>ReflectionProperty::isProtected</methodname></member>
|
||||
<member><methodname>ReflectionProperty::isProtectedSet</methodname></member>
|
||||
<member><methodname>ReflectionProperty::isPrivate</methodname></member>
|
||||
<member><methodname>ReflectionProperty::isPrivateSet</methodname></member>
|
||||
<member><methodname>ReflectionProperty::isReadOnly</methodname></member>
|
||||
<member><methodname>ReflectionProperty::isStatic</methodname></member>
|
||||
</simplelist>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- EN-Revision: 14dc7c47365f2b71f6c907a5ba5bccf42534d5a9 Maintainer: leonardolara Status: ready -->
|
||||
<!-- EN-Revision: 2ca1058473429d338de6eb773f268fc18a71d2f9 Maintainer: leonardolara Status: ready -->
|
||||
<refentry xml:id="function.socket-write" xmlns="http://docbook.org/ns/docbook">
|
||||
<refnamediv>
|
||||
<refname>socket_write</refname>
|
||||
@@ -46,8 +46,8 @@
|
||||
<para>
|
||||
O parâmetro opcional <parameter>length</parameter> pode especificar um
|
||||
comprimento alternativo de bytes escritos no soquete. Se esse comprimento for
|
||||
maior que o comprimento do buffer, ele será truncado silenciosamente para o comprimento
|
||||
do buffer.
|
||||
maior que o comprimento de <parameter>data</parameter>,
|
||||
ele será truncado silenciosamente para o comprimento de <parameter>data</parameter>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@@ -102,10 +102,11 @@
|
||||
<note>
|
||||
<para>
|
||||
<function>socket_write</function> não escreve necessariamente todos os bytes
|
||||
do buffer fornecido. É válido que, dependendo dos buffers da rede
|
||||
etc., apenas uma certa quantidade de dados, mesmo que um byte, seja
|
||||
escrita, embora o seu buffer seja maior. Deve-se ter atenção para não esquecer
|
||||
involuntariamente de transmitir o restante dos dados.
|
||||
do parâmetro <parameter>data</parameter> fornecido. É válido que, dependendo dos buffers
|
||||
de rede etc., apenas uma certa quantidade de dados, mesmo que um byte, seja escrita,
|
||||
embora <parameter>data</parameter> seja maior.
|
||||
Um laço precisa ser usado para assegurar que o resto de <parameter>data</parameter>
|
||||
seja transmitido.
|
||||
</para>
|
||||
</note>
|
||||
</refsect1>
|
||||
|
||||
Reference in New Issue
Block a user