Co to znaczy, że funkcja PHP rozpoczyna się od znaku ampersand?

131

Używam biblioteki Facebooka z tym kodem:

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

Co oznacza & na początku definicji funkcji i jak mam się do tego zabrać z taką biblioteką (w prostym przykładzie)

Alex Mcp
źródło

Odpowiedzi:

158

Znak ampersand przed nazwą funkcji oznacza, że ​​funkcja zwróci odwołanie do zmiennej zamiast wartości.

Zwracanie przez odniesienie jest przydatne, gdy chcesz użyć funkcji do znalezienia zmiennej, do której należy przypisać odwołanie. Nie używaj zwrotu przez odwołanie, aby zwiększyć wydajność. Silnik sam to zoptymalizuje automatycznie. Zwróć referencje tylko wtedy, gdy masz ku temu ważny techniczny powód.

Zobacz Zwracanie referencji .

Dominic Rodger
źródło
1
Tak więc, bez wchodzenia w szczegóły, wywołałbyś (z instancją klasy) coś takiego jak $ results = $ facebook-> users_hasAppPermission ($ param1, $ param2); ? Chyba nie jestem pewien co do niuansów, ale dzięki za pomoc.
Alex Mcp
2
Tak - tak to nazwałbym.
Dominic Rodger
16

Jak już wspomniano, zwraca odniesienie. W PHP 4 obiektom przypisywano wartość, tak jak każdej innej wartości. Jest to wysoce nieintuicyjne i sprzeczne z tym, jak działa większość innych języków.

Aby obejść ten problem, wykorzystano odniesienia do zmiennych wskazujących na obiekty. W PHP 5 odwołania są bardzo rzadko używane. Domyślam się, że jest to starszy kod lub kod, który próbuje zachować wsteczną zgodność z PHP 4.

troelskn
źródło
To oficjalna biblioteka PHP na Facebooku, FWIW.
Alex Mcp
4
@Alex: W takim przypadku prawdopodobnie robią to, aby chronić hakerów, którzy używają php4, przed sobą. Nie powinieneś tego robić we własnym kodzie - jest przestarzały.
troelskn
3
„Jest to wysoce nieintuicyjne i sprzeczne z tym, jak działa większość innych języków”. Nie mogłem się nie zgodzić.
Wyścigi lekkości na orbicie
5
@WildlyInaccurate: Domyślne przypisywanie obiektów przez odniesienie, co dzieje się w .NET i Javie (myślę), jest wysoce nieintuicyjne. W większości innych języków przypisywanie odbywa się za pomocą kopii, niezależnie od tego, czy masz „przedmiot”, prymityw, czy cokolwiek innego, a ponieważ tak było od zarania dziejów, świat powinien był tego trzymać się.
Wyścigi lekkości na orbicie
4
To, czy coś jest intuicyjne, jest prawdopodobnie raczej subiektywne. Ale w przypadku języków, które są poza tym podobne do PHP, normą jest przekazywanie obiektów przez odniesienie. Jeśli chodzi o OOP, powiedziałbym, że jest to najbardziej intuicyjny sposób, ponieważ OOP dotyczy hermetyzacji stanu, więc programy zwykle odwołują się do tego stanu, zamiast go klonować.
troelskn
4

Jest to często nazywane w PHP jako zwracanie odniesienia lub zwracanie przez odniesienie .

Zwracanie przez odniesienie jest przydatne, gdy chcesz użyć funkcji do znalezienia zmiennej, do której należy przypisać odwołanie. Nie używaj zwrotu przez odwołanie, aby zwiększyć wydajność. Silnik sam to zoptymalizuje automatycznie. Zwróć referencje tylko wtedy, gdy masz ku temu ważny techniczny powód.

Dokumentacja PHP dotycząca zwracania referencji

Odniesienia w PHP jest po prostu inna nazwa przypisana do zmiennej treści. Odwołania do PHP nie są podobne do wskaźników w programowaniu w C , nie są rzeczywistymi adresami pamięci, więc nie mogą być używane do arytmetyki wskaźników.

Koncepcja zwracania referencji może być bardzo myląca, szczególnie dla początkujących, więc przykład będzie pomocny.

$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 

Funkcja getPopulationCount()zdefiniowana za pomocą poprzedzającego &zwraca odwołanie do zawartości lub wartości $populationCount. Tak więc, inkrementacja $countryPopulation, także inkrementacja $populationCount.

Elisha Senoo
źródło