O que significa iniciar uma função PHP com um e comercial?

129

Estou usando a biblioteca do Facebook com este código:

class FacebookRestClient {
...
    public function &users_hasAppPermission($ext_perm, $uid=null) {
        return $this->call_method('facebook.users.hasAppPermission', 
        array('ext_perm' => $ext_perm, 'uid' => $uid));
    }
...
}

O que significa o & no início da definição da função e como faço para usar uma biblioteca como esta (em um exemplo simples)

Alex Mcp
fonte

Respostas:

157

Um "e" comercial antes de um nome de função significa que a função retornará uma referência a uma variável em vez do valor.

Retornar por referência é útil quando você deseja usar uma função para descobrir a qual variável uma referência deve ser vinculada. Não use retorno por referência para aumentar o desempenho. O mecanismo otimizará automaticamente isso por conta própria. Somente retorne referências quando você tiver um motivo técnico válido para isso.

Consulte Retornando referências .

Dominic Rodger
fonte
1
Portanto, sem entrar em muitos detalhes, você chamaria (com a classe instanciada) algo como $ results = $ facebook-> users_hasAppPermission ($ param1, $ param2); ? Acho que não tenho certeza da nuance aqui, obrigado pela ajuda.
Alex Mcp
2
Sim - eu chamaria assim.
Dominic Rodger
16

Está retornando uma referência, como já mencionado. No PHP 4, os objetos foram atribuídos por valor, assim como qualquer outro valor. Isso é altamente intuitivo e contrário ao funcionamento da maioria dos outros idiomas.

Para contornar o problema, foram usadas referências para variáveis ​​que apontavam para objetos. No PHP 5, as referências são muito raramente usadas. Eu estou supondo que este é um código legado ou código tentando preservar a compatibilidade com o PHP 4.

Troelskn
fonte
É a biblioteca PHP oficial do Facebook, FWIW.
Alex Mcp
4
@ Alex: Nesse caso, eles provavelmente estão fazendo isso para proteger hackers casuais, que usam php4, deles mesmos. Você não deve fazer isso em seu próprio código - está obsoleto.
troelskn
3
"Isso é altamente intuitivo e contrário ao funcionamento da maioria dos outros idiomas", eu não poderia discordar mais.
Lightness Races in Orbit em
5
@WildlyInaccurate: atribuir objetos por referência por padrão, o que acontece no .NET e no Java (eu acho), é altamente pouco intuitivo. Na maioria dos outros idiomas, a atribuição é feita por cópia, se você tem um "objeto" ou um primitivo ou o que quer que seja, e como esse é o caso desde o início dos tempos, é para isso que o mundo deveria se ater.
Lightness Races in Orbit
4
Se algo é intuitivo é provavelmente bastante subjetivo. Mas para linguagens que são semelhantes ao PHP, a norma é passar objetos por referência. Em relação ao POO, eu diria que é a maneira mais intuitiva, já que o POO é sobre o estado de encapsulamento, portanto os programas geralmente se referem a esse estado, em vez de cloná-lo.
troelskn
4

Isso geralmente é conhecido no PHP como Retornando referência ou Retornando por referência .

Retornar por referência é útil quando você deseja usar uma função para descobrir a qual variável uma referência deve ser vinculada. Não use retorno por referência para aumentar o desempenho. O mecanismo otimizará automaticamente isso por conta própria. Somente retorne referências quando você tiver um motivo técnico válido para isso.

Documentação PHP em Retornando referência

Uma referência em PHP é simplesmente outro nome atribuído ao conteúdo de uma variável. As referências PHP não são como ponteiros na programação C , não são endereços de memória reais, portanto não podem ser usadas para aritmética de ponteiros.

O conceito de retornar referências pode ser muito confuso, especialmente para iniciantes, portanto, um exemplo será útil.

$populationCount = 120;

function &getPopulationCount() {
  global $populationCount;
  return $populationCount;
}

$countryPopulation =& getPopulationCount();
$countryPopulation++;
echo "\$populationCount = $populationCount\n"; // Output: $populationCount = 121 
echo "\$countryPopulation = $countryPopulation\n"; //Output: $countryPopulation = 121 

A função getPopulationCount()definida com um precedente &retorna a referência ao conteúdo ou valor de $populationCount. Então, incrementar $countryPopulationtambém incrementa $populationCount.

Elisha Senoo
fonte