Was bedeutet es, eine PHP-Funktion mit einem kaufmännischen Und zu starten?

129

Ich benutze die Facebook-Bibliothek mit diesem Code:

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

Was bedeutet das & am Anfang der Funktionsdefinition und wie verwende ich eine solche Bibliothek (in einem einfachen Beispiel)?

Alex Mcp
quelle

Antworten:

157

Ein kaufmännisches Und vor einem Funktionsnamen bedeutet, dass die Funktion anstelle des Werts einen Verweis auf eine Variable zurückgibt.

Die Rückgabe per Referenz ist nützlich, wenn Sie mithilfe einer Funktion ermitteln möchten, an welche Variable eine Referenz gebunden werden soll. Verwenden Sie Return-by-Reference nicht, um die Leistung zu steigern. Der Motor optimiert dies automatisch von selbst. Geben Sie Referenzen nur zurück, wenn Sie einen gültigen technischen Grund dafür haben.

Siehe Zurückgeben von Referenzen .

Dominic Rodger
quelle
1
Ohne zu sehr ins Detail zu gehen, würden Sie (mit instanziierter Klasse) so etwas wie $ results = $ facebook-> users_hasAppPermission ($ param1, $ param2) aufrufen. ? Ich bin mir der Nuance hier wohl nicht sicher, danke für die Hilfe.
Alex Mcp
2
Ja - ich würde es einfach so nennen.
Dominic Rodger
16

Wie bereits erwähnt, wird eine Referenz zurückgegeben. In PHP 4 wurden Objekte wie jeder andere Wert nach Wert zugewiesen. Dies ist höchst unintuitiv und widerspricht der Funktionsweise der meisten anderen Sprachen.

Um das Problem zu umgehen, wurden Referenzen für Variablen verwendet, die auf Objekte zeigten. In PHP 5 werden Referenzen sehr selten verwendet. Ich vermute, dies ist Legacy-Code oder Code, der versucht, die Abwärtskompatibilität mit PHP 4 aufrechtzuerhalten.

troelskn
quelle
Es ist die offizielle Facebook PHP Bibliothek, FWIW.
Alex Mcp
4
@Alex: In diesem Fall tun sie es wahrscheinlich, um gelegentliche Hacker, die PHP4 verwenden, vor sich selbst zu schützen. Sie sollten dies nicht in Ihrem eigenen Code tun - es ist veraltet.
Troelskn
3
"Das ist sehr unintuitiv und widerspricht der Funktionsweise der meisten anderen Sprachen." Mehr konnte ich nicht widersprechen.
Leichtigkeitsrennen im Orbit
5
@WildlyInaccurate: Das standardmäßige Zuweisen von Objekten als Referenz, was in .NET und in Java (glaube ich) der Fall ist, ist höchst unintuitiv. In den meisten anderen Sprachen erfolgt die Zuweisung per Kopie, unabhängig davon, ob Sie ein "Objekt" oder ein Grundelement oder was auch immer haben, und da dies seit Anbeginn der Zeit der Fall ist, sollte die Welt daran festhalten.
Leichtigkeitsrennen im Orbit
4
Ob etwas intuitiv ist, ist wahrscheinlich eher subjektiv. Bei Sprachen, die ansonsten PHP ähnlich sind, besteht die Norm darin, Objekte als Referenz zu übergeben. In Bezug auf OOP würde ich sagen, dass dies der intuitivste Weg ist, da es bei OOP darum geht, den Status zu kapseln, sodass Programme normalerweise auf diesen Status verweisen, anstatt ihn zu klonen.
Troelskn
4

Dies wird in PHP häufig als Rückgabereferenz oder Rückgabe nach Referenz bezeichnet .

Die Rückgabe per Referenz ist nützlich, wenn Sie mithilfe einer Funktion ermitteln möchten, an welche Variable eine Referenz gebunden werden soll. Verwenden Sie Return-by-Reference nicht, um die Leistung zu steigern. Der Motor optimiert dies automatisch von selbst. Geben Sie Referenzen nur zurück, wenn Sie einen gültigen technischen Grund dafür haben.

PHP-Dokumentation zur Rückgabe der Referenz

Eine Referenz in PHP ist einfach ein anderer Name, der dem Inhalt einer Variablen zugewiesen wird. PHP-Referenzen sind keine Zeiger in der C-Programmierung , sie sind keine tatsächlichen Speicheradressen und können daher nicht für Zeigerarithmetik verwendet werden.

Das Konzept der Rückgabe von Referenzen kann insbesondere für Anfänger sehr verwirrend sein, daher ist ein Beispiel hilfreich.

$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 

Die getPopulationCount()mit einem Vorgänger definierte Funktion &gibt den Verweis auf den Inhalt oder Wert von zurück $populationCount. Inkrementieren also $countryPopulationauch Inkrementieren $populationCount.

Elisha Senoo
quelle