mirror of
https://github.com/php/doc-pt_br.git
synced 2026-03-23 22:52:12 +01:00
sync with en rev
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
-->
|
||||
|
||||
|
||||
@@ -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
|
||||
=& $GLOBALS['var'];</literal>. Assim atribuir outra referência
|
||||
=& $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>&</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>&</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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user