sync with en rev

This commit is contained in:
leonardolara
2024-08-25 21:32:24 -03:00
parent c1261a1e25
commit ae3a0856ca
10 changed files with 327 additions and 187 deletions

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 15841d188475e59c105f57c9022873f2cd7467b5 Maintainer: ae Status: ready --><!-- CREDITS: royopa,diegopires,narigone,ae,leonardolara -->
<!-- EN-Revision: d5d10b38b4395e77827b04d5290bb137bd3872b4 Maintainer: ae Status: ready --><!-- CREDITS: royopa,diegopires,narigone,ae,leonardolara -->
<chapter xml:id="configuration" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Configuração em tempo de execução</title>
@@ -261,8 +261,62 @@ $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
</para>
<para>
<variablelist>
<variablelist>
<!--
Replace everything inside the <variablelist> element with an <xi:include>
once libxml2 gets XInclude 1.1 attribute copying support.
The below <xi:include> will include the appropriate elements
but needs all top-level xml:id's removed (see XInclude 1.1 set-xml-id).
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('constant.ini-mode')/*)"><xi:fallback/></xi:include>
-->
<title>Constantes de modo INI</title>
<varlistentry>
<term>
<constant>INI_USER</constant>
(<type>int</type>)
</term>
<listitem>
<simpara>
A entrada pode ser definida em scripts do usuário (como com <function xmlns="http://docbook.org/ns/docbook">ini_set</function>)
ou no <link xmlns="http://docbook.org/ns/docbook" linkend="configuration.changes.windows">registro do Windows</link>.
A entrada pode ser definida no &user-ini;
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>
<constant>INI_PERDIR</constant>
(<type>int</type>)
</term>
<listitem>
<simpara>
A entrada pode ser definida no &php.ini;, &htaccess;, &httpd.conf; ou &user-ini;
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>
<constant>INI_SYSTEM</constant>
(<type>int</type>)
</term>
<listitem>
<simpara>
A entrada pode ser definida no &php.ini; ou &httpd.conf;
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term>
<constant>INI_ALL</constant>
(<type>int</type>)
</term>
<listitem>
<simpara>
A entrada pode ser definida em qualquer lugar
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
</sect1>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 437bbf134e015c678f9d4b8a5b8da53429a9a12d Maintainer: ae Status: ready --><!-- CREDITS: ae,klaussilveira,lisaldo,mauricio -->
<!-- EN-Revision: 38ee86c3c030bc74362a7e5c185192ef8ad5a442 Maintainer: ae Status: ready --><!-- CREDITS: ae,klaussilveira,lisaldo,mauricio,leonardolara -->
<!-- Part titles used mostly in manual.xml itself -->
<!ENTITY PHPManual "Manual do PHP">
@@ -79,6 +79,7 @@
<!ENTITY InheritedConstants "Constantes herdadas">
<!ENTITY Constants "Constantes">
<!ENTITY NotAvailable "Não Disponível">
<!ENTITY Constructor "Construtor">
<!-- These are used in reference/$extname/reference.xml and other
supplemental files to mark section titles -->

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 2a4874ed531bcc223ca4bc1b4f9a5292594abaea Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<!-- EN-Revision: 80720e59fc88b2522fe2e119b0148caaaa214b0b Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<refentry xml:id="closure.bindto" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>Closure::bindTo</refname>
@@ -33,12 +33,12 @@
<para>
Closures estáticas não podem ter nenhum objeto ligado (o valor do parâmetro
<parameter>newThis</parameter> deveria ser &null;), mas esta função pode
<parameter>newThis</parameter> deveria ser &null;), mas este método pode
entretanto ser utilizada para alterar seus escopos de classe.
</para>
<para>
Esta função vai assegurar que, para uma closure não estática, possuir uma
Este método vai assegurar que, para uma closure não estática, possuir uma
instância ligada irá implicar em ter escopo definido e vice-versa. Para este fim,
closures não estáticas que recebem um escopo com instância &null; são tornadas
estáticas; e closures não estáticas sem escopo que recebem uma instância

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: a7f535a32ba19f7e8236b9d87f3d84552c5f9b64 Maintainer: lhsazevedo Status: ready --><!-- CREDITS: felipe,fabioluciano,lhsazevedo -->
<!-- EN-Revision: d58ee8eaaa7f716c51f66f5f1058ab3c42376d98 Maintainer: lhsazevedo Status: ready --><!-- CREDITS: felipe,fabioluciano,lhsazevedo,leonardolara -->
<refentry role="variable" xml:id="reserved.variables.globals" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
@@ -24,7 +24,9 @@
<programlisting role="php">
<![CDATA[
<?php
function teste() {
function teste()
{
$foo = "variável local";
echo '$foo no escopo global: ' . $GLOBALS["foo"] . "\n";
@@ -33,6 +35,7 @@ function teste() {
$foo = "Conteúdo de exemplo";
teste();
?>
]]>
</programlisting>
@@ -51,18 +54,20 @@ $foo no escopo atual: variável local
<example xml:id="variable.globals.entire_write_error">
<title>Escrever em todo o <varname>$GLOBALS</varname> irá resultar em um erro.</title>
<programlisting role="php">
<![CDATA[
<?php
// Gera um erro em tempo de compilação:
$GLOBALS = [];
$GLOBALS += [];
$GLOBALS =& $x;
$x =& $GLOBALS;
unset($GLOBALS);
array_pop($GLOBALS);
// ...e qualquer outra operação de escrita/leitura-escrita no $GLOBALS
?>
]]>
<![CDATA[
<?php
// Gera um erro em tempo de compilação:
$GLOBALS = [];
$GLOBALS += [];
$GLOBALS =& $x;
$x =& $GLOBALS;
unset($GLOBALS);
array_pop($GLOBALS);
// ...e qualquer outra operação de escrita/leitura em $GLOBALS
?>
]]>
</programlisting>
</example>
</para>
@@ -81,24 +86,33 @@ $foo no escopo atual: variável local
</note>
<note>
<para>
A partir do PHP 8.1.0, <varname>$GLOBALS</varname> agora é uma cópia somente leitura da tabela de símbolos globais. Isto é, variáveis globais não podem ser modificadas por meio de suas cópias. Anteriormente, o array <varname>$GLOBALS</varname> era excluído do comportamento usual por valor dos arrays PHP e variáveis globais podiam ser modificadas por meio de suas copias.
<informalexample>
A partir do PHP 8.1.0, <varname>$GLOBALS</varname> agora é uma cópia somente-leitura da
<link linkend="features.gc.refcounting-basics">tabela de símbolos</link> globais.
Isto é, variáveis globais não podem ser modificadas por meio de suas cópias.
Anteriormente, o array <varname>$GLOBALS</varname> era excluído do comportamento
usual "por valor" dos arrays PHP e variáveis globais podiam ser modificadas por meio de suas cópias.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// Antes do PHP 8.1.0
$a = 1;
$globals = $GLOBALS; // Cópia ostensivamente por valor
$globals = $GLOBALS; // Cópia ostensiva "por valor"
$globals['a'] = 2;
var_dump($a); // int(2)
// A partir do PHP 8.1.0
// isto não modifica mais $a. O comportamento anterior violava a semântica por valor.
// A partir do PHP 8.1.0,
// isto não mais modifica $a. O comportamento anterior violava a semântica "por valor".
$globals = $GLOBALS;
$globals['a'] = 1;
// Para restaurar o comportamento anterior, itere sua cópia e atribua cada propriedade de volta ao $GLOBALS.
foreach ($globals as $chave => $valor) {
$GLOBALS[$chave] = $valor;
// Para restaurar o comportamento anterior, itera sua cópia e atribui cada propriedade de volta ao $GLOBALS.
foreach ($globals as $key => $value) {
$GLOBALS[$key] = $value;
}
?>
]]>
</programlisting>
@@ -129,4 +143,3 @@ vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 6d29533483657c036e49edb5ea88c7103d126681 Maintainer: ae Status: ready --><!-- CREDITS: ae,amandavale,felipe -->
<!-- EN-Revision: d58ee8eaaa7f716c51f66f5f1058ab3c42376d98 Maintainer: ae Status: ready --><!-- CREDITS: ae,amandavale,felipe,leonardolara -->
<chapter xml:id="language.references" xmlns="http://docbook.org/ns/docbook">
<title>Referências</title>
@@ -7,16 +7,17 @@
<title>O que são referências</title>
<simpara>
Referência em PHP significa acessar o mesmo conteúdo de variável
através de vários nomes. Isto não é parecido com os ponteiros em C. Por exemplo
através de vários nomes. Isto não é parecido com os ponteiros em C. Por exemplo,
não é possível efetuar aritmética de ponteiros com referências, já que elas
não são endereços de memória. Veja
não são endereços de memória. Consulte
<xref linkend="language.references.arent" /> para mais
informações. Referências são como uma tabela de apelidos simbólicos. No
PHP um nome de variável e o conteúdo de variável são diferentes, de forma um mesmo
conteúdo pode ter nomes diferentes. A analogia mais próxima são com arquivos
e nomes de arquivos Unix - os nomes de variáveis como nomes de arquivos,
enquanto que o conteúdo das variáveis os conteúdos dos arquivos. Referências, assim,
são como os hardlinks no sistema de arquivo Unix.
informações. Ao invés disso, elas são
apelidos para <link linkend="features.gc.refcounting-basics">tabela de símbolos</link>.
Observe que no PHP, um nome de variável e um conteúdo de variável são coisas diferentes, portanto o mesmo
conteúdo pode ter nomes diferentes. A analogia mais próxima é com arquivos
e nomes de arquivos Unix - os nomes de variáveis são como entradas de diretórios,
enquanto que o conteúdo de variável é com o conteúdo do arquivo em si. Referências são
parecidas com ligações concretas no sistema de arquivo Unix.
</simpara>
</sect1>
@@ -29,29 +30,31 @@
por referência</link>,
e <link linkend="language.references.whatdo.return">retorno por
referência</link>. Esta seção fará uma introdução dessas
operações, com links para leituras posteriores.
operações, com atalhos para leituras posteriores.
</para>
<sect2 xml:id="language.references.whatdo.assign">
<title>Atribuição por referência</title>
<para>
Referências no PHP permitem criar duas
variáveis que se referem ao mesmo conteúdo. Ou seja, quando você faz:
variáveis que se referem ao mesmo conteúdo. Ou seja, quando se faz:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$a =& $b;
?>
]]>
</programlisting>
</informalexample>
então aqui <varname>$a</varname> e <varname>$b</varname>
<varname>$a</varname> e <varname>$b</varname>
apontam para o mesmo conteúdo.
<note>
<para>
<varname>$a</varname> e <varname>$b</varname> são completamente
iguais aqui, mas não porque <varname>$a</varname> está apontando para
<varname>$b</varname> ou vice versa, mas sim que
<varname>$b</varname> ou vice-versa, mas sim que
<varname>$a</varname> e <varname>$b</varname> apontam para o
mesmo lugar.
</para>
@@ -59,24 +62,26 @@ $a =& $b;
</para>
<note>
<para>
Se você atribuir, passar ou retornar uma variável indefinida por referência,
ela irá ser criada.
Se uma variável indefinida for atribuída, passada ou retornada por referência,
ela será criada.
<example>
<title>Usando referência com variáveis indefinidas</title>
<programlisting role="php">
<![CDATA[
<?php
function foo(&$var) { }
foo($a); // $a é "criada" e setada par null
function foo(&$var) {}
foo($a); // $a é "criada" e definida como null
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new stdClass;
$c = new stdClass();
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
]]>
</programlisting>
@@ -84,13 +89,15 @@ var_dump(property_exists($c, 'd')); // bool(true)
</para>
</note>
<para>
A mesma sintaxe pode ser utilizada com funções, que retornem
A mesma sintaxe pode ser utilizada com funções que retornem
referências:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$foo =& find_var($bar);
?>
]]>
</programlisting>
@@ -105,20 +112,22 @@ $foo =& find_var($bar);
</para>
<warning>
<para>
Se você atribuir uma referência para uma variável declarada <literal>global</literal>
dentro da função, a referência irá ser visível somente dentro da função.
Você pode evitar isso usando o array <varname>$GLOBALS</varname>.
Se for atribuída uma referência para uma variável declarada <literal>global</literal>
dentro da função, a referência será visível somente dentro da função.
Pode-se evitar isso usando o array <varname>$GLOBALS</varname>.
<example>
<title>Referenciando variáveis globais de dentro de funções</title>
<programlisting role="php">
<![CDATA[
<?php
$var1 = "Example variable";
$var1 = "Variável de exemplo";
$var2 = "";
function global_references($use_globals)
{
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // visível somente dentro da função
} else {
@@ -127,33 +136,39 @@ function global_references($use_globals)
}
global_references(false);
echo "var2 is set to '$var2'\n"; // var2 is set to ''
echo "var2 é definida como '$var2'\n"; // var2 é definida como ''
global_references(true);
echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable'
echo "var2 é definida como '$var2'\n"; // var2 é definida como 'Variável de exemplo'
?>
]]>
</programlisting>
</example>
Veja <literal>global $var;</literal> como atalho para <literal>$var
=&amp; $GLOBALS['var'];</literal>. Assim atribuir outra referência
=&amp; $GLOBALS['var'];</literal>. Assim, atribuir outra referência
para <literal>$var</literal> somente modifica a variável de referência local.
</para>
</warning>
<note>
<para>
Se você atribuir um valor para uma variável com referência numa instrução
&foreach; a referência também é modificada.
Se um valor for atribuído por referência a uma variável numa instrução
&foreach;, a referência também é modificada.
<example>
<title>Referências e o comando foreach</title>
<programlisting role="php">
<![CDATA[
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// faz alguma coisa
// Faz alguma coisa
}
echo $ref; // 3 - último elemento do array iterado
?>
]]>
</programlisting>
@@ -162,7 +177,7 @@ echo $ref; // 3 - último elemento do array iterado
</note>
<para>
Ainda que não seja uma atribuição por referência explícita, expressões criadas
com o constructo
com o construtor
<link linkend="function.array"><literal>array()</literal></link> também podem
se comportar como tais com o prefixo <literal>&amp;</literal> no elemento de array
a ser acrescentado. Exemplo:
@@ -170,11 +185,16 @@ echo $ref; // 3 - último elemento do array iterado
<programlisting role="php">
<![CDATA[
<?php
$a = 1;
$b = array(2, 3);
$arr = array(&$a, &$b[0], &$b[1]);
$arr[0]++; $arr[1]++; $arr[2]++;
$arr[0]++;
$arr[1]++;
$arr[2]++;
/* $a == 2, $b == array(3, 4); */
?>
]]>
</programlisting>
@@ -190,26 +210,28 @@ $arr[0]++; $arr[1]++; $arr[2]++;
<programlisting role="php">
<![CDATA[
<?php
/* Atribuição de variáveis escalares */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c não é referência; não modifica $a ou $b
$c = 7; // $c não é referência; não modifica $a ou $b
/* Atribuição de variaveis do array */
$arr = array(1);
$a =& $arr[0]; //$a e $arr[0] estão no mesmo conjunto de referências
$arr2 = $arr; //não atribui por referência!
$a =& $arr[0]; // $a e $arr[0] estão no mesmo conjunto de referências
$arr2 = $arr; // Não atribui por referência!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* O conteúd de $arr foi modificado mesmo que ele não seja uma referência! */
/* O conteúdo de $arr é modificado embora ele não seja uma referência! */
?>
]]>
</programlisting>
</informalexample>
Em outras palavras, o comportamento de referências em arrays é definido
elemento por elemento. O comportamento de referências dos elementos individualmente
são dissociados da referência do container array.
elemento por elemento. O comportamento de referências dos elementos individuais
é dissociado do status da referência do array que os contém.
</para>
</sect2>
<sect2 xml:id="language.references.whatdo.pass">
@@ -223,6 +245,7 @@ $arr2[0]++;
<programlisting role="php">
<![CDATA[
<?php
function foo(&$var)
{
$var++;
@@ -230,6 +253,7 @@ function foo(&$var)
$a=5;
foo($a);
?>
]]>
</programlisting>
@@ -255,16 +279,19 @@ foo($a);
<title>O que referências não são</title>
<para>
Como dito anteriormente, referências não são ponteiros. Isso significa que
a construção seguinte não funciona como se possa esperar:
a construção a seguir não funciona como se possa esperar:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function foo(&$var)
{
$var =& $GLOBALS["baz"];
}
foo($bar);
?>
]]>
</programlisting>
@@ -279,30 +306,33 @@ foo($bar);
utilizando-se o mecanismo de referência, pois <varname>$bar</varname> não está
disponível na função <varname>foo</varname> (ela é representada por
<varname>$var</varname>, mas <varname>$var</varname> somente tem
o conteúdo da variável e não a ligação nome-valor na tabela de símbolos
do chamador).
Você pode utilizar o <link linkend="language.references.return">retorno por
referência</link> para retornar referências de variáveis manipuladas por funções.
o conteúdo da variável e não a vinculação nome-valor na
<link linkend="features.gc.refcounting-basics">tabela de símbolos</link> do chamador).
Pode-se utilizar <link linkend="language.references.return">retorno por
referência</link> para referenciar variáveis selecionadas pela função.
</simpara>
</sect1>
<sect1 xml:id="language.references.pass">
<title>Passagem por referência</title>
<para>
Você pode passar uma variável por referência a uma função de forma que a função
Uma variável pode ser passada por referência a uma função de forma que a função
possa modificar a variável. A sintaxe é a seguinte:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
// $a é 6 aqui
?>
]]>
</programlisting>
@@ -330,16 +360,20 @@ foo($a);
<programlisting role="php">
<![CDATA[
<?php
function foo(&$var)
{
$var++;
}
function &bar()
{
$a = 5;
return $a;
}
foo(bar());
?>
]]>
</programlisting>
@@ -358,26 +392,28 @@ foo(bar());
<programlisting role="php">
<![CDATA[
<?php
function foo(&$var)
{
$var++;
}
function bar() // Repare que falta &
{
$a = 5;
return $a;
}
foo(bar()); // Gera um alerta
foo(bar()); // Gera um aviso
foo($a = 5); // Expressão, não uma variável
foo(5); // Gera um erro fatal
class Foobar
{
}
class Foobar {}
foo(new Foobar()) // Produz um aviso no PHP 7.0.7
// Somente variáveis devem ser passadas por referência
?>
]]>
</programlisting>
@@ -388,28 +424,32 @@ foo(new Foobar()) // Produz um aviso no PHP 7.0.7
<sect1 xml:id="language.references.return">
<title>Retornando referências</title>
<para>
Retorno por referência é útil quando você precisa utilizar uma função
Retorno por referência é útil quando é necessário utilizar uma função
para localizar variáveis cuja referência precisa ser obtida.
<emphasis>Não</emphasis> use retorno por referência para aumentar performance, a
engine é esperta o bastante para otimizar isto para você. Somente retorne referências
quando você tem uma razão técnica para isso! Para
retornar referências, use a sintaxe:
<emphasis>Não</emphasis> deve ser usado retorno por referência para aumentar desempenho, o
mecanismo é esperto o bastante para otimizar isso. Referências somente devem ser retornadas
quando existir uma razão técnica para isso! Para
retornar referências, a sintaxe abaixo deve ser usada:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
class foo {
class Foo
{
public $value = 42;
public function &getValue() {
public function &getValue()
{
return $this->value;
}
}
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue é uma referência a $obj->value, que é 42.
$obj = new Foo();
$myValue = &$obj->getValue(); // $myValue é uma referência a $obj->value, que é 42
$obj->value = 2;
echo $myValue; // imprime o valor valor de $obj->value, ou seja, 2.
echo $myValue; // imprime o valor valor de $obj->value, ou seja, 2
?>
]]>
</programlisting>
@@ -420,7 +460,7 @@ echo $myValue; // imprime o valor valor de $obj->value, ou seja,
</para>
<note>
<simpara>
Diferentemente da passagem de parâmetros por referência, aqui você precisa utilizar
Diferentemente da passagem de parâmetros por referência, aqui é necessário utilizar
<literal>&amp;</literal> em ambos os lugares - primeiro para indicar o
retorno por referência (e não a cópia), e depois para indicar a
ligação da referência (em vez da assimilação convencional) que precisa ser
@@ -429,40 +469,48 @@ echo $myValue; // imprime o valor valor de $obj->value, ou seja,
</note>
<note>
<simpara>
Se você tentar retornar uma referência de uma função com a sintaxe:
<literal>return ($this->value);</literal> isto <emphasis>não</emphasis> irá
funcionar como você espera, para retornar o resultado de uma
<emphasis>expressão</emphasis>, e não uma variável, por referência. Você pode
somente retornar variáveis por referência para uma função - nada além.
Se houver tentativa de retornar uma referência de uma função com a sintaxe
<literal>return ($this->value);</literal>, isto <emphasis>não</emphasis>
funcionará como esperado para retornar o resultado de uma
<emphasis>expressão</emphasis>, e não uma variável, por referência. Deve-se
retornar variáveis por referência somente para uma função - nada além disso.
</simpara>
</note>
<para>
Para utilizar a referência retornada, você precisa utilizar a atribuição por referência:
Para utilizar a referência retornada, é necessário utilizar a atribuição por referência:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function &collector() {
static $collection = array();
return $collection;
function &collector()
{
static $collection = array();
return $collection;
}
$collection = &collector();
$collection[] = 'foo';
?>
]]>
</programlisting>
</informalexample>
Para passar a referência retornada para outra função qual espera uma referência
você pode utilizar a seguinte sintaxe:
Para passar a referência retornada para outra função que espera uma referência,
a seguinte sintaxe pode ser utilizada:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function &collector() {
static $collection = array();
return $collection;
function &collector()
{
static $collection = array();
return $collection;
}
array_push(collector(), 'foo');
?>
]]>
</programlisting>
@@ -479,16 +527,18 @@ array_push(collector(), 'foo');
<sect1 xml:id="language.references.unset">
<title>Destruindo referências</title>
<para>
Quando você quebra uma referência, ela apenas pára de fazer o apontamento entre
Quando uma referência é quebrada, ela apenas para de fazer o apontamento entre
o nome da variável e o conteúdo. Mas isto não significa que
o conteúdo da variável será destruído. Por exemplo:
o conteúdo da variável é destruído. Por exemplo:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$a = 1;
$b =& $a;
unset ($a);
?>
]]>
</programlisting>
@@ -514,14 +564,16 @@ unset ($a);
<sect2 xml:id="references.global">
<title>Referências globais</title>
<para>
Quando você declara uma variável como <command>global $var</command>, você
está de fato criando um referência para a variável global. Isto significa que
Quando uma variável é declarada como <command>global $var</command>,
de fato uma referência está sendo criada para a variável global. Isto significa que
isto é o mesmo que:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$var =& $GLOBALS["var"];
?>
]]>
</programlisting>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: e311803cd2fb931ad80bab6fd0f996d2ece6e2b8 Maintainer: lhsazevedo Status: ready --><!-- CREDITS: narigone,lucasr,felipe,lhsazevedo,fernandowobeto -->
<!-- EN-Revision: d58ee8eaaa7f716c51f66f5f1058ab3c42376d98 Maintainer: lhsazevedo Status: ready --><!-- CREDITS: narigone,lucasr,felipe,lhsazevedo,fernandowobeto,leonardolara -->
<refentry xml:id="function.compact" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>compact</refname>
@@ -17,14 +17,15 @@
</para>
<para>
Para cada um dos parâmetros passados, <function>compact</function> procura
uma variável com o nome especificado na tabela de símbolos e a adiciona
no array de saída de forma que o nome da variável será a chave e o seu
conteúdo será o valor para esta chave.
uma variável com o nome especificado na
<link linkend="features.gc.refcounting-basics">tabela de símbolos</link> atual
e a adiciona no array de saída de forma que o nome da variável se torne a chave
e o conteúdo da variável se torne o valor para essa chave.
Em resumo, ela faz o oposto de <function>extract</function>.
</para>
<note>
<para>
Antes do PHP 7.3, quaisquer strings que não estão definidas serão silenciosamente ignoradas.
Antes do PHP 7.3, quaisquer strings que não estejam definidas seriam silenciosamente ignoradas.
</para>
</note>
</refsect1>
@@ -128,7 +129,7 @@ Array
<refsect1 role="notes">
&reftitle.notes;
<note>
<title>Gotcha</title>
<title>Armadilha</title>
<para>
Devido a <link linkend="language.variables.variable">variáveis
variável</link> não poderem ser usadas com <link

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 4a7ddddc27271967b616ad3400cfbe2a9b48212b Maintainer: ae Status: ready --><!-- CREDITS: adiel,felipe,lucasr,ae -->
<!-- EN-Revision: d58ee8eaaa7f716c51f66f5f1058ab3c42376d98 Maintainer: ae Status: ready --><!-- CREDITS: adiel,felipe,lucasr,ae,leonardolara -->
<refentry xml:id="function.extract" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>extract</refname>
@@ -14,17 +14,18 @@
<methodparam choice="opt"><type>string</type><parameter>prefix</parameter><initializer>""</initializer></methodparam>
</methodsynopsis>
<para>
Importar variáveis a partir de um array para a tabela de símbolos corrente.
Importa variáveis a partir de um array para a
<link linkend="features.gc.refcounting-basics">tabela de símbolos</link> atual.
</para>
<para>
Verifica cada chave se ela tem nome de variável
válido. Também verifica por colisões com já existente variáveis
Verifica se cada chave tem um nome válido de variável.
Também verifica por colisões com variáveis já existentes
na tabela de símbolos.
</para>
<warning>
<para>
Não use <function>extract</function> em dados inseguros, como informações externas
(e.g. <varname>$_GET</varname>, <varname>$_FILES</varname>).
(ex.: <varname>$_GET</varname>, <varname>$_FILES</varname>).
</para>
</warning>
</refsect1>
@@ -36,14 +37,14 @@
<term><parameter>array</parameter></term>
<listitem>
<para>
Um array associativo. Esta função trata chaves como nome de variáveis
e valores com os valores da variáveis. Para cada par chave/valor ela cria
uma variável na atual tabela de símbolo, seguindo os parâmetros
Um array associativo. Esta função trata chaves como nomes de variáveis
e valores como os valores das variáveis. Para cada par chave/valor ela cria
uma variável na tabela de símbolos atual, seguindo os parâmetros
<parameter>flags</parameter> e <parameter>prefix</parameter>.
</para>
<para>
Você precisa usar um array associativo, um array numericamente indexado
não irá produzir resultado até que você use <constant>EXTR_PREFIX_ALL</constant> ou
É necesário usar um array associativo, um array numericamente indexado
não produzirá resultados até que seja usa a opção <constant>EXTR_PREFIX_ALL</constant> ou
<constant>EXTR_PREFIX_INVALID</constant>.
</para>
</listitem>
@@ -52,8 +53,8 @@
<term><parameter>flags</parameter></term>
<listitem>
<para>
A forma como inválida/chaves numéricas e colisões são tratadas é determinada
por <parameter>flags</parameter>. Pode ser um dos
A forma como chaves inválidas/numéricas e colisões são tratadas é determinada
pelas opções de extração definidas no parâmetro <parameter>flags</parameter>. Pode ser um dos
seguintes valores:
<variablelist>
<varlistentry>
@@ -150,7 +151,7 @@
<constant>EXTR_PREFIX_IF_EXISTS</constant>. Se o nome com o prefixo
não for um nome de variável válido, ela não será importada para a tabela
de símbolos. Prefixos são automaticamente separados da chave do array pelo
caractere underscore.
caractere de sublinhado (_).
</para>
</listitem>
</varlistentry>
@@ -161,7 +162,7 @@
&reftitle.returnvalues;
<para>
Retorna o número de variáveis importadas com sucesso para a tabela de
símbolo.
símbolos.
</para>
</refsect1>
<refsect1 role="examples">
@@ -170,7 +171,7 @@
<example>
<title>Exemplo da <function>extract</function></title>
<para>
Uma possível utilização de <function>extract</function> é na importação de
Uma possível utilização de <function>extract</function> é na importação de
variáveis contidas num array associativo retornado pela função
<function>wddx_deserialize</function>.
</para>
@@ -182,9 +183,12 @@
wddx_deserialize */
$size = "large";
$var_array = array("color" => "blue",
"size" => "medium",
"shape" => "sphere");
$var_array = array(
"color" => "blue",
"size" => "medium",
"shape" => "sphere"
);
extract($var_array, EXTR_PREFIX_SAME, "wddx");
echo "$color, $size, $shape, $wddx_size\n";
@@ -199,14 +203,14 @@ blue, large, sphere, medium
]]>
</screen>
<para>
O <varname>$size</varname> não foi sobrescrito, porque nós especificamos
O <varname>$size</varname> não foi sobrescrito, porque foi especificada a opção
<constant>EXTR_PREFIX_SAME</constant>, o que resultou na criação da variável
<varname>$wddx_size</varname>. Se <constant>EXTR_SKIP</constant> fosse
utilizado, então <varname>$wddx_size</varname> não seria criada.
<varname>$wddx_size</varname>. Se <constant>EXTR_SKIP</constant> fosse
utilizada, então <varname>$wddx_size</varname> não seria criada.
<constant>EXTR_OVERWRITE</constant> teria feito com que
<varname>$size</varname> tivesse o valor "medium", e
<constant>EXTR_PREFIX_ALL</constant> resultaria em novas variáveis
com os nomes <varname>$wddx_color</varname>, <varname>$wddx_size</varname>, e
com os nomes <varname>$wddx_color</varname>, <varname>$wddx_size</varname> e
<varname>$wddx_shape</varname>.
</para>
</example>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: d228d0aa06de880fc50f748dc2cb66805892d9df Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<!-- EN-Revision: d5d10b38b4395e77827b04d5290bb137bd3872b4 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<appendix xml:id="info.constants" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
&reftitle.constants;
&extension.constants.core;
@@ -96,8 +96,7 @@
Todos os créditos, equivalente a usar: <literal xmlns="http://docbook.org/ns/docbook">CREDITS_DOCS +
CREDITS_GENERAL + CREDITS_GROUP + CREDITS_MODULES + CREDITS_QA
CREDITS_FULLPAGE</literal>. Gera uma página HTML completa
com as etiquetas apropriadas.
Este é o valor padrão.
com as etiquetas apropriadas. Este é o valor padrão.
</simpara>
</listitem>
</varlistentry>
@@ -201,8 +200,8 @@
</variablelist>
<variablelist xml:id="constant.ini-mode" role="constant_list">
<title>INI mode constants</title>
<varlistentry>
<title>Constantes de modo INI</title>
<varlistentry xml:id="constant.ini-user">
<term>
<constant>INI_USER</constant>
(<type>int</type>)
@@ -215,7 +214,7 @@
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<varlistentry xml:id="constant.ini-perdir">
<term>
<constant>INI_PERDIR</constant>
(<type>int</type>)
@@ -226,7 +225,7 @@
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<varlistentry xml:id="constant.ini-system">
<term>
<constant>INI_SYSTEM</constant>
(<type>int</type>)
@@ -237,7 +236,7 @@
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<varlistentry xml:id="constant.ini-all">
<term>
<constant>INI_ALL</constant>
(<type>int</type>)

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 26e26a95fdc3aac9b464068953ea3105dee00f14 Maintainer: leonardolara Status: ready -->
<!-- EN-Revision: 4150dc92749c177758efe59eab23b6a5d32ffda2 Maintainer: leonardolara Status: ready -->
<refentry xml:id="function.unserialize" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>unserialize</refname>
@@ -54,16 +54,16 @@
</para>
<para>
<note>
<title>unserialize_callback_func directive</title>
<title>
Diretiva
<link linkend="ini.unserialize-callback-func">unserialize_callback_func</link>
</title>
<para>
É possível definir uma função de retorno de chamada,
se uma classe indefinida tiver sido instanciada durante a desserialização.
(para evitar receber um objeto imcompleto do tipo <type>object</type>
<classname>__PHP_Incomplete_Class</classname>.)
Deve-se usar o &php.ini;, a função <function>ini_set</function> ou o arquivo &htaccess;
para definir <link linkend="ini.unserialize-callback-func">unserialize_callback_func</link>.
Toda vez que uma classe indefinida precisar ser instanciada, ela será chamada. Para desabilitar este recurso basta
esvaziar esta configuração.
A função de retorno especificada na diretiva
<link linkend="ini.unserialize-callback-func">unserialize_callback_func</link>
é chamada quando uma classe indefinida é desserializada.
Se nenhuma função for especificada, o objeto será instanciado como
<classname>__PHP_Incomplete_Class</classname>.
</para>
</note>
</para>

View File

@@ -1,45 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: c5d92fd7127e059d448d43ba339f19956f83b05a Maintainer: rafaelbernard Status: ready --><!-- CREDITS: rafaelbernard,narigone -->
<!-- EN-Revision: 91570644fbbe4d23e79908e1a04c4c4d003fe587 Maintainer: rafaelbernard Status: ready --><!-- CREDITS: rafaelbernard,narigone,leonardolara -->
<!-- splitted from ./index.xml, last change in rev 1.66 -->
<chapter xml:id="security.filesystem" xmlns="http://docbook.org/ns/docbook">
<title>Segurança do Sistema de Arquivos</title>
<simpara>
O <acronym>PHP</acronym> está sujeito à segurança encontrada na maioria dos sistemas de servidor
com respeito à permissões de arquivos e diretórios. Isso permite que
você controle quais arquivos no sistema podem ser lidos e por quem. É preciso
seja controlado que arquivos no sistema podem ser lidos e por quem. É preciso
ter cuidado com quaisquer arquivos que são lidos por todos para assegurar
que eles podem ser lidos por todos os usuários que tem acesso ao
que eles podem ser lidos por todos os usuários que têm acesso ao
sistema de arquivos.
</simpara>
<simpara>
Já que o <acronym>PHP</acronym> foi moldado para permitir acesso em nível de usuário ao sistema
Já que o <acronym>PHP</acronym> foi projetado para permitir acesso em nível de usuário ao sistema
de arquivos, é possível escrever um script <acronym>PHP</acronym> que permitirá
ler arquivos do sistema como o /etc/passwd, modificar suas conexões
ler arquivos do sistema como o <filename>/etc/passwd</filename>, modificar suas conexões
de rede, enviar inúmeros trabalhos de impressão, etc. Isso tem
algumas implicações óbvias, já que você precisa ter certeza que os arquivos
que você lê e escreve são apropriados.
algumas implicações óbvias, já que é necessário garantir que os arquivos
lidos e gravados são apropriados.
</simpara>
<simpara>
Considere o seguinte script, onde um usuário indica que quer
apagar um arquivo no seu diretório home. Isso presume uma situação
apagar um arquivo no seu diretório "home". Isso presume uma situação
onde uma interface web <acronym>PHP</acronym> é usada regularmente para controle
de arquivos, então o usuário do Apache tem permissão de apagar arquivos
nos diretórios home dos usuários.
nos diretórios "home" dos usuários.
</simpara>
<para>
<example>
<title>Checagem fraca de variáveis resulta em....</title>
<title>Verificação fraca de variáveis resulta em....</title>
<programlisting role="php">
<![CDATA[
<?php
// remove a file from the user's home directory
// Remove um arquivo do diretório "home" do usuário
$username = $_POST['user_submitted_name'];
$userfile = $_POST['user_submitted_filename'];
$homedir = "/home/$username";
unlink("$homedir/$userfile");
echo "The file has been deleted!";
echo "O arquivo foi removido!";
?>
]]>
</programlisting>
@@ -49,13 +51,15 @@ echo "The file has been deleted!";
e apagá-lo, mesmo que eles não tenham permissão para fazê-lo.
Nesse caso, é preciso ter alguma outra forma de autenticação.
Considere o que poderia acontecer se as variáveis enviadas forem
"../etc/" and "passwd". O código então leria efetivamente:
<literal>"../etc/"</literal> e <literal>"passwd"</literal>.
O código então leria efetivamente:
<example>
<title>... um ataque ao sistema de arquivos</title>
<programlisting role="php">
<![CDATA[
<?php
// remove um arquivo de qualquer lugar no disco rígido
// Remove um arquivo de qualquer lugar no disco rígido
// que o usuário do PHP tenha acesso. Se o PHP tiver acesso de administrador (root):
$username = $_POST['user_submitted_name']; // "../etc"
$userfile = $_POST['user_submitted_filename']; // "passwd"
@@ -63,7 +67,8 @@ $homedir = "/home/$username"; // "/home/../etc"
unlink("$homedir/$userfile"); // "/home/../etc/passwd"
echo "The file has been deleted!";
echo "O arquivo foi removido!";
?>
]]>
</programlisting>
@@ -88,7 +93,8 @@ echo "The file has been deleted!";
<programlisting role="php">
<![CDATA[
<?php
// remove um arquivo do disco rígido que o
// Remove um arquivo do disco rígido que o
// usuário do PHP tenha acesso.
$username = $_SERVER['REMOTE_USER']; // usando um mecanismo de autenticação
$userfile = basename($_POST['user_submitted_filename']);
@@ -97,10 +103,11 @@ $homedir = "/home/$username";
$filepath = "$homedir/$userfile";
if (file_exists($filepath) && unlink($filepath)) {
$logstring = "Deleted $filepath\n";
$logstring = "Removido $filepath\n";
} else {
$logstring = "Failed to delete $filepath\n";
$logstring = "Falhar ao remover $filepath\n";
}
$fp = fopen("/home/logging/filedelete.log", "a");
fwrite($fp, $logstring);
fclose($fp);
@@ -113,13 +120,14 @@ echo htmlentities($logstring, ENT_QUOTES);
</example>
No entanto, ele ainda possui falhas. Se seu sistema de autenticação
permitir que os usuários criem seu próprios logins, e um usuário
escolher o login "../etc/", o sistema está novamente exposto. Por
essa razão, você pode preferir escrever uma checagem mais personalizada:
escolher o login <literal>"../etc/"</literal>, o sistema está novamente exposto. Por
essa razão, é preferível escrever uma verificação mais personalizada:
<example>
<title>Checagem mais segura do nome do arquivo</title>
<title>Verificação mais segura do nome do arquivo</title>
<programlisting role="php">
<![CDATA[
<?php
$username = $_SERVER['REMOTE_USER']; // usando um mecanismo de autenticação
$userfile = $_POST['user_submitted_filename'];
$homedir = "/home/$username";
@@ -127,10 +135,11 @@ $homedir = "/home/$username";
$filepath = "$homedir/$userfile";
if (!ctype_alnum($username) || !preg_match('/^(?:[a-z0-9_-]|\.(?!\.))+$/iD', $userfile)) {
die("Bad username/filename");
die("Usuário/arquivo inválido");
}
//etc...
// etc.
?>
]]>
</programlisting>
@@ -138,33 +147,38 @@ if (!ctype_alnum($username) || !preg_match('/^(?:[a-z0-9_-]|\.(?!\.))+$/iD', $us
</para>
<para>
Dependendo do sistema operacional, existe uma variedade enorme de arquivos
com os quais se preocupar, incluindo dispositivos (/dev/
or COM1), arquivos de configuração (arquivos /etc/ e .ini),
áres de armazenamento conhecidas (/home/, My Documents), etc. Por essa
com os quais se preocupar, incluindo dispositivos (<filename>/dev/</filename>
ou <filename>COM1</filename>), arquivos de configuração (arquivos <filename>/etc/</filename>
e arquivos <literal>.ini</literal>), áreas de armazenamento de arquivo bem conhecidas (<filename>/home/</filename>,
<filename>My Documents</filename>), etc. Por essa
razão, normalmente é mais fácil criar uma política onde se proibe
tudo exceto aquilo que for explicitamente permitido.
</para>
<sect1 xml:id="security.filesystem.nullbytes">
<title>Problemas relacionados a bytes nulos (Null)</title>
<title>Problemas relacionados a bytes nulos (NUL)</title>
<simpara>
Como o <acronym>PHP</acronym> usa funções em C para operações relacionadas ao
sistema de arquivos, ele pode lidar com bytes nulos de maneira inexperada.
Como bytes nulos denotam fim de string em C, strings contendo eles
sistema de arquivos, ele pode lidar com bytes nulos de maneira inesperada.
Como bytes nulos denotam fim de string em C, strings que os contém
não serão consideradas de forma inteira, mas apenas até que um byte nulo ocorra.
O seguinte exemplo mostra um código vulnerável que demonstra esse problema:
</simpara>
<example>
<title>Script vulnerável à bytes nulos</title>
<title>Script vulnerável a bytes nulos</title>
<programlisting role="php">
<![CDATA[
<?php
$file = $_GET['file']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/'.$file.'.php')) {
// file_exists will return true as the file /home/wwwrun/../../etc/passwd exists
include '/home/wwwrun/'.$file.'.php';
// the file /etc/passwd will be included
if (file_exists('/home/wwwrun/' . $file. '.php')) {
// file_exists retornará true porque o arquivo /home/wwwrun/../../etc/passwd existe
include '/home/wwwrun/' . $file . '.php';
// o arquivo /etc/passwd será incluído
}
?>
]]>
</programlisting>
@@ -178,18 +192,20 @@ if (file_exists('/home/wwwrun/'.$file.'.php')) {
<programlisting role="php">
<![CDATA[
<?php
$file = $_GET['file'];
// Whitelisting possible values
// Autorizando valores possíveis
switch ($file) {
case 'main':
case 'foo':
case 'bar':
include '/home/wwwrun/include/'.$file.'.php';
include '/home/wwwrun/include/' . $file . '.php';
break;
default:
include '/home/wwwrun/include/main.php';
}
?>
]]>
</programlisting>