Nebenwirkungen?
Jup.
$func->($foo)
&$func($foo)
Diese beiden Sachen sind noch identisch.
$func->()
&$func
Diese nicht mehr.
Wenn man eine Subroutine mit einem & aufruft und keine Argumente übergibt dann wird immer automatisch das Array (@_) übergeben. Sprich die aktuelle Argumentenliste. Und das kann zu Nebenwirkungen führen die man nicht sofort sieht. Ich weiß jetzt gar nicht ob @_ auch übergeben wird wenn man eine Leere Klammern hinzufügt. Aber egal ob es das tut oder nicht. Es wäre kein Vorteil wenn sich leere Klammern komplett anders verhalten wie das weg lassen der Klammern. Wie gesagt sowas ist absolut nicht empfohlen.
Deswegen immer mit nem Pfeil dereferenzieren. Aber das mit dem & ist aber auch schon uralt und stammt eher aus Perl 4 Zeiten. Ich meine nichtmal "Einführung in Perl" das auch schon recht veraltet ist sagt einem das man Subroutinen mit einem & aufrufen soll.
Und das mit den geschweiften Klammern Um Referenzen hab ich aus BestPractices, so allgemein für Referenzen...
Also eigentlich nicht. 😉
Aus dem Kapitel Subroutinen heißt die erste Regel "Rufen Sie Unterroutinen mit Klammern, aber ohne führendes & auf."
Und aus dem Kapitel Referenzen heißt die erste Regel. "Dereferenzieren Sie möglichst immer mit Pfeilen".
"Möglichst immer" deswegen weil es ja nicht immer möglich ist, mit dem Pfeilen genau das auszudrücken was man meint.
Ansonsten dient das Buch ja nur dazu um über seinen Code darüber nachzudenken ob das was man geschrieben hat lesbar genug ist. Bzw. es werden ja auch Vor/Nachteile genannt der einzelnen Sachen. Es ist ja keine heilige Schrift an der man sich halten muss. 😉 Ich selber nutze z.B. auch nicht "$objekt->foo()->bar()->welt()" da ich sowas häßlich finde. ich schreibe dann auch eher "$objekt->foo->bar->welt"