As variáveis do PHP são passadas por valor ou por referência?
php
variables
pass-by-reference
pass-by-value
cmcculloh
fonte
fonte
Respostas:
É pelo valor de acordo com a documentação do PHP .
fonte
$str = add_some_extra($str);
se eu não estivesse usando a referência, certo? então qual é o verdadeiro valor agregado disso?$str
seria atribuída nula, no seu caso.No PHP, por padrão, os objetos são passados como cópia de referência para um novo Objeto.
Veja este exemplo .............
Agora veja isso ..............
Agora veja isso ..............
Espero que você possa entender isso.
fonte
$y
não é necessário - não há nadafunction changeValue
que exija que ele esteja dentroclass Y
, para que emaranhe dois conceitos não relacionados. Eu mudariafunction changeValue
para o escopo externo, logo acima$x = new X();
. Remova todas as referências a$y
. Agora é mais fácil ver que os dois primeiros exemplos deixam $ x em paz e o terceiro altera seu conteúdo paranew Y()
. O que seria mais fácil para ver se você jogou otype
de$x
- o fato de que tantoX
eY
acontecer para incluir um$abc
campo também é irrelevante para o que é demonstradoParece que muitas pessoas ficam confusas com a maneira como os objetos são passados para as funções e o que passa por referência. As variáveis de objeto ainda são passadas por valor, apenas o valor que é passado no PHP5 é um identificador de referência. Como prova:
Saídas:
Para passar por referência , podemos modificar as variáveis que são vistas pelo chamador. Que claramente o código acima não funciona. Precisamos mudar a função de swap para:
Saídas:
para passar por referência.
fonte
swap
função; em outras palavras, se os objetos fossem "passados por valor". Por outro lado, também é exatamente o que você esperaria se um identificador de objeto fosse passado para a função, que é realmente o que acontece. Seu código não faz distinção entre esses dois casos.http://www.php.net/manual/en/migration5.oop.php
fonte
As variáveis PHP são atribuídas por valor, passadas para funções por valor, e quando os objetos que contêm / representam são passados por referência. Você pode forçar as variáveis a passar por referência usando um &
Atribuído por exemplo de valor / referência:
produziria
Aprovado no exame de valor / referência:
produziria:
Variáveis de objeto aprovadas pelo exemplo de referência:
Saída:
(esse último exemplo poderia ser melhor provavelmente ...)
fonte
$foo
é um ponteiro para um objeto .$foo
é passado por valor para a funçãochangeFoo()
, poischangeFoo()
não declarou seu parâmetro com a&
.Você pode passar uma variável para uma função por referência. Esta função poderá modificar a variável original.
Você pode definir a passagem por referência na definição da função:
fonte
Você pode fazer isso de qualquer maneira.
coloque um símbolo '&' na frente e a variável que você está passando passa a ser a mesma de sua origem. ou seja: você pode passar por referência, em vez de fazer uma cópia.
tão
fonte
Variáveis contendo tipos primitivos são passadas por valor no PHP5. Variáveis que contêm objetos são passadas por referência. Há um artigo bastante interessante do Linux Journal de 2006 que menciona essa e outras diferenças OO entre 4 e 5.
http://www.linuxjournal.com/article/9170
fonte
&
.Objetos são passados por referência no PHP 5 e por valor no PHP 4. Variáveis são passadas por valor por padrão!
Leia aqui: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html
fonte
&
.&
na frente dos parâmetros na definição - se eles foram passados por valor, o objeto contido no escopo que chamou a função com ele como parâmetro não seja afetado.Os atributos ainda são modificáveis quando não são passados por referência, portanto, tenha cuidado.
Resultado:
SwapObjects: b, a SwapValues: a, b
fonte
Para quem se deparar com isso no futuro, quero compartilhar esta gema dos documentos PHP, publicados por um usuário anônimo :
E aqui está o exemplo que eles fornecem:
Escrevi um post extenso e detalhado sobre este assunto para JavaScript , mas acredito que se aplica igualmente bem ao PHP, C ++ e qualquer outra linguagem em que as pessoas pareçam estar confusas sobre passagem por valor versus passagem por referência.
Claramente, PHP, como C ++, é uma linguagem que suporta passagem por referência. Por padrão, os objetos são passados por valor. Ao trabalhar com variáveis que armazenam objetos, ajuda a vê-las como ponteiros (porque é fundamentalmente o que elas são no nível da montagem). Se você passar um ponteiro por valor, ainda poderá "rastrear" o ponteiro e modificar as propriedades do objeto que está sendo apontado. O que você não pode fazer é apontar para um objeto diferente. Somente se você declarar explicitamente um parâmetro como sendo passado por referência, poderá fazer isso.
fonte
Na verdade, ambos os métodos são válidos, mas isso depende de sua exigência. Os valores de passagem por referência geralmente tornam seu script lento. Portanto, é melhor passar variáveis por valor considerando o tempo de execução. Além disso, o fluxo de código é mais consistente quando você passa variáveis por valor.
fonte
Use isso para funções quando desejar simplesmente alterar a variável original e retorná-la novamente ao mesmo nome de variável com seu novo valor atribuído.
fonte
Depende da versão, 4 é por valor, 5 é por referência.
fonte