+1

Referências ou Ponteiros em PHP?

criado por Allyson F. de Paula Reis em 14/11/2003 9:55am
Referências PHP permitem fazer duas variáveis se referirem ao mesmo conteúdo.

A analogia mais próxima é a dos arquivos e seus nomes em sistemas UNIX: nomes de variáveis são o caminho completo dos arquivos, enquanto o conteúdo da variável são os dados desse arquivo. Assim, referências pode ser tomadas como os links físicos dentro do sistema de arquivos UNIX.

Ou seja:

<?php 

$a = &$b; 

// aqui $a e $b apontam para a mesma variável. 

?> 


Logo $a e $b são completamente iguais aqui, mas não porque $a está apontando para $b ou vice versa, mas sim que $a e $b apontam para o mesmo lugar.


A mesma sintaxe pode ser utilizada com funções, que retornem referências, e com o operador new (a partir do PHP 4.0.4):


$bar = & new fooclass();
$foo = & find_var ($bar);




Porém vale lembrar que a NÃO utilização do operador & causará a cópia do objeto. Se você utiliza $this em classes, ele operará na instância atual do objeto. A assimilação sem & irá copiar a instância (o objeto em si) e $this irá operar na cópia, podendo não ser esse procedimento sempre desejável. Normalmente você precisará trabalhar com uma instância única, seja por motivos de performance ou de consumo de memória.

Você pode utilizar o operador @ para esconder quaisquer erros em construtores na forma @new, mas isto não funciona quando utilizada a instrução &new. Esta é uma limitação da Zend Engine e irá gerar um erro de interpretação (parser error).

A segunda coisa que referências permitem é passar variáveis por referência. Isto é feito marcando uma variável local de uma função e a variável do escopo chamador como referências ao mesmo conteúdo. Exemplo:

<?php 
function foo (&$var) 
{ 
    $var++; 
} 

$a=5; 
foo ($a); 

echo $a; 
?> 


Isso fará que $a seja 6. Isto acontece porque na função foo a variável $var se refere ao mesmo conteúdo que $a.


Mas como dito anteriormente, referências NÃO SÃO ponteiros. Isto significa que o construtor seguinte não fará o que você espera:

<?php 
function foo (&$var) 
{ 
    $var =& $GLOBALS["baz"]; 
} 
foo($bar); 
?> 



Acontece que $var na função foo estará apontada para $bar na chamada, mas ela será re-apontada para $GLOBALS["baz"]. Não existe maneira de apontar $bar no escopo chamador para qualquer outra coisa utilizando o mecanismo de referências, desde que $bar não está disponível na função foo (ela é representa por $var, mas $var somente tem o conteúdo da variável e não um relacionamento nome para valor na tabela simbólica).

Comentários:

Mostrando 1 - 10 de 14 comentários
Olá Emanuel Fonseca,

Acho que você não leu todo o artigo, na última página está escrito:

Fonte: "Manual do PHP"
09/02/2004 9:12pm (~20 anos atrás)

Na boa qdo utilizar material de qualquer lugar, seria bom vc colocar a referencia. Lembre-se que outras pessoas tiveram trabalho para escrever e assim merecem nosso reconhecimento e gratidão.

http://www.iar.unicamp.br/suporte/php/language.references.whatdo.html
06/12/2003 10:02pm (~20 anos atrás)

Geralmente, quando se envia dados via formulários, existe a pretenção de usar todos os valores de todos os campos, certo?!

Considerando "register_globals = Off".
Uma opção boa seria a função import_request_variables().

Ela recebe dois argumentos. O primeiro define que tipo de variável de requisição importar (G = GET, P = POST e C = COOKIE) e o segundo seria um prefixo.



Exemplo:

Considere dois campos no formulário usando método GET: campo "email" e campo "senha".

Quando enviado para o PHP eles chegarão como:

> $_GET["email"]
> $_GET["senha"]

se na primeira linha do PHP você colocar:

> import_request_variables("G", "f_");

Passarão a existir as seguintes variáveis:

> $f_email
> $f_senha

Observação: O segundo argumento poderia ser deixado em branco e assim seriam criadas váriaveis:

> $email
> $senha

------------------------------

Falei alguma novidade? Ajudei? :)
Abraços!

Daniel.

[obs.: Meu primeiro comentário, peguem leve ... hehehe]
26/11/2003 3:07pm (~20 anos atrás)

Manda ver Marcelão! :)

[z]
18/11/2003 6:52pm (~20 anos atrás)

Opa

Cara... Tudo isso que eu disse está na documentação do PHP, então sinta-se a vontade para publicar seu artigo =]

[]`s

Ragen
18/11/2003 7:37am (~20 anos atrás)

Bom, colocarei os dois exemplos e o link deste artigo no meu artigo sobre o assunto
e os devidos agradecimentos

sobre a referência no vetor foi fantástica a idéia :)

darei os créditos claro a ti..

Abraços,

fico no aguardo da permissão de vcs (ragen e silvano)
17/11/2003 8:18pm (~20 anos atrás)

Você diz

register_globals=on

?

Se a guente for pensar em 2 ou 3 variaveis globais o consumo de memória é quase insignificante, mas por outro lado se for uma manipulaçao de milhares de variaveis? Se você pudesse reduzir pelo menos 20% delas usando referências já seria uma grande economia...

Mas geralmente você irá precisar de referencias se você estiver trabalhando com classes (Como citado no artigo).

[]`s

Ragen
17/11/2003 1:33pm (~20 anos atrás)

Cara... Não testei ainda

Mas seria algo tipo:

foreach ($_GET AS &$campo => &$valor) {
${$campo} = $valor;
}
17/11/2003 1:25pm (~20 anos atrás)

Que bela bobagem acabei de escrever.
Perdão.

E...
'Uma saida seria

$a = &$_GET['foo'];

$$a = 'lalala';'

Aqui você não estaria criando uma nova variável também?


E Ragen, que saída você vê para não precisar se preocupar com o register_globals, sem ter consumo extra de memória?

[z]
17/11/2003 1:24pm (~20 anos atrás)

foreach ($_GET AS $campo => $valor) {
&${$campo} = $valor;
}

? heh

[z]
17/11/2003 1:19pm (~20 anos atrás)

Novo Comentário:

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