+1

Referências ou Ponteiros em PHP?

criado por Allyson F. de Paula Reis em 14/11/2003 9:55am
Você pode passar variáveis para funções por referência, então a função poderá modificar seus argumentos. A sintaxe é a seguinte:


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

$a=5;
foo ($a);
// $a é 6 aqui
?>



Note que não há o sinal de referência na chamada da função, somente na definição da função. A marcação na definição da função sozinha é suficiente para configurar corretamente a passagem de argumentos por referência.

As coisas a seguir podem ser passadas por referência:


Variáveis. Exemplo: foo($a)

Instrução new. Exemplo foo(new foobar())

Outra referência, retornada de uma função. Exemplo:

<?php 
function &bar() 
{ 
    $a = 5; 
    return $a; 
} 
foo(bar()); 
?> 


Nenhuma outra expressão poderá ser passada por referência, com resultados indefinidos. Por exemplo, o exemplo seguinte de passagem por referência é inválido:

<?php 
function bar() // Note a falta do & 
{ 
    $a = 5; 
    return $a; 
} 
foo(bar()); 

foo($a = 5) // Expressão, não é variável 
foo(5) // Constante, não é variável 
?> 


Essas limitações valem para o PHP 4.0.4 em diante.

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 (~21 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 (~21 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 (~21 anos atrás)

Manda ver Marcelão! :)

[z]
18/11/2003 6:52pm (~21 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 (~21 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 (~21 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 (~21 anos atrás)

Cara... Não testei ainda

Mas seria algo tipo:

foreach ($_GET AS &$campo => &$valor) {
${$campo} = $valor;
}
17/11/2003 1:25pm (~21 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 (~21 anos atrás)

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

? heh

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

Novo Comentário:

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