Pergunta

Estou recebendo sinais confusos por todo lado.

Devo usar o E comercial para passar variáveis ​​por referência ou não?

O link a seguir parece me dizer que está obsoleto e não é mais necessário:
http://gtk.php.net/manual/en/html/tutorials/tutorials.changes.references.html

Mas tópicos como esses me fazem pensar:
A passagem por referência do tempo de chamada foi descontinuada?
PHP e E comercial

Deixe-me formular minha pergunta como um exemplo.

Se eu fizer uma função, usando PHP 5.5.5:

function recurring_mailer_form($form, $form_state) 
{

}

É o mesmo que:

function recurring_mailer_form($form, &$form_state) 
{

}

?

Foi útil?

Solução

A razão pela qual diferentes artigos parecem dizer coisas diferentes é que estão falando sobre diferentes tipos de passagem por referência.

A principal coisa que determina se um parâmetro deve ser passado por referência é a própria assinatura da função, e os fundamentos disso não mudaram desde o PHP 4.Considere este exemplo:

function foo( $by_value, &$by_reference ) { /* ... */ }

$a = 1; $b = 2;
foo( $a, $b );

Aqui, a variável externa $a está sendo passado para a função por valor, como se estivesse sendo atribuído como $by_value = $a; - muda para $by_value não pode afetar $a.A variável $b porém está sendo passado por referência;assim como uma atribuição do formulário $by_reference =& $b; isso significa que há uma variável referenciada por dois nomes e qualquer atribuição a uma delas atuará como uma atribuição a ambos.

Se você passar um valor "comum" (uma string, um número ou um array) por valor, seu valor será apenas copiado para a nova variável. A partir do PHP 5:Se você passar um objeto por valor, entretanto, algo um pouco diferente acontece - o "valor" copiado é apenas um ponteiro para o mesmo objeto.Isto significa que se $a fosse um objeto, você poderia chamar $by_value->some_property = 42; e $a->some_property também seria 42.No entanto, se você atribuiu algum novo valor a $by_value, ainda assim não afetaria $a.

Até PHP 5.4, houve um extra forma de passar um parâmetro por referência, que era "forçar" o comportamento da referência na hora da chamada.Isso significava que você poderia escrever foo(&$a, &$b); e "capturar" alterações feitas em $by_value dentro de foo() função.Depender disso geralmente era uma má ideia e por isso foi removido.(Ele chegou ao 5.4 porque era planejado para ser removido no PHP 6, mas esse projeto foi colocado em espera por tempo indeterminado, com as mudanças menores chegando ao 5.3 e 5.4).

Finalmente, as funções podem retornar uma variável por referência (como discutido no manual aqui).Isso é um pouco complicado, pois na verdade exige que você coloque & em dois lugares:no início da declaração da função, para dizer que return deve significar "retornar esta referência de variável" e não "retornar este valor";e no código que a chama, atribuir uma variável a essa referência, em vez de apenas copiar seu valor.Aqui está um exemplo bobo que combina um parâmetro de referência com um retorno de referência (os dois não precisam andar juntos, é apenas um exemplo):

function &bar(&$some_param) { return $some_param; }
$a = 1;
$b =& bar($a);
// $b and $a now point at the same variable, not just the same value
// it was passed into and out of a function, and assigned to a new variable, 
// but all those operations were by reference

Observe que muitas pessoas acreditam erroneamente que passar uma variável por referência lhes proporcionará um benefício de desempenho, e essa geralmente era a única razão para usar a passagem por referência no tempo de chamada.Na verdade, isso geralmente está errado, já que o Zend Engine que alimenta o PHP usa uma técnica chamada "copy on write" para deixar múltiplas variáveis ​​que têm o mesmo valor apontando para o mesmo pedaço de memória, mesmo que não estejam ligadas como referências.Na verdade, a atribuição de referência geralmente derrotas esta otimização, devido à forma como o mecanismo rastreia quais variáveis ​​estão no estado copy-on-write.

Outras dicas

Não não é.

  • Os objetos são sempre passados ​​automaticamente como referências (informação! veja abaixo para obter informações adicionais importantes!)

  • A declaração de parâmetros como referências deve acontecer na definição da função:

    function test(&$var) {}
    

    Não na hora de chamá-lo:

    // wrong
    $var = '123';
    test(&$var);
    


Se você passar um objeto normalmente, poderá alterar o estado (propriedades) do objeto.
Assuma isso $obj é uma instância da classe TestClass que contém uma variável de membro chamada hello (clique aqui para uma amostra completa em Ideone.com):

function modify($obj) { $obj->hello = 'world (modified)!'; }

$obj->hello = 'world';
modify($obj);
var_dump($obj->hello);  // outputs "world (modified!)"

Isso deve ser autoexplicativo.Agora, usando o mesmo código, mas atribuindo outro valor a $obj em vez disso, modificar o estado do objeto não resulta em nenhuma modificação (→ Ideone.com):

function modify($obj) { $obj = 42; }
// ...
var_dump($obj->hello);  // outputs "world"

Somente aceitar o parâmetro explicitamente como referência nos dá a capacidade de alterar completamente o conteúdo da variável (→ Ideone.com):

function modify(&$obj) { $obj = 42; }
// ...
var_dump($obj);         // outputs "42"

Não, não são iguais.O PHP 5.4+ apenas detecta na chamada se a referência é necessária quando a função é chamada, verificando a declaração.

Portanto, não, não está obsoleto, pois você precisa do operador de referência na declaração da função, se esse for o uso pretendido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top