14 Stimmen

Kann man eine PHP-Funktion rekursiv machen, ohne ihren Namen zu wiederholen?

Es hat mich schon immer gestört, dass eine rekursive Funktion sich selbst benennen muss, wenn eine instanziierte Klasse den Namen $this und eine statische Methode kann mit self usw.

Gibt es eine ähnliche Möglichkeit, dies in einer rekursiven Funktion zu tun, ohne sie erneut zu benennen (nur um den Wartungsaufwand zu verringern)?

Offensichtlich könnte ich call_user_func oder die __FUNCTION__ konstant, aber ich würde etwas weniger Hässliches vorziehen.

5 Stimmen

Warum ist __FUNCTION__ hässlich? Scheint ein sehr guter Weg zu sein, um zu erreichen, was Sie wollen...

0 Stimmen

@Felix, weil es wahrscheinlich hinzugefügt werden muss call_user_func oder mit eval . Ich würde etwas vorziehen wie self::($var)

2 Stimmen

Siehe meine Antwort... Sie können variable Funktionen verwenden, um dies zu vermeiden.

0voto

ArtisticPhoenix Punkte 20796

Sie können die Argumente einfach einfügen, indem Sie func_get_args() et le Variadic ou ... hinzugefügt in 5.6.

Als verfahrenstechnische Funktion

function foo($arg,$arg1) {
    __FUNCTION__(...func_get_args());
}

Als eine Klassenmethode:

protected function foo($arg,$arg1,$arg3, $etc) {
    $this->{__FUNCTION__}(...func_get_args());
}

https://www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list

Zufälligerweise funktioniert dies immer dann, wenn Sie ein Array von Argumenten in eine Methode oder Funktion einfügen wollen...

Zum Beispiel (auch diese sind gleichwertig)

public function foo($arg,$arg1)
   call_user_func_array([$this, __FUNCTION__], func_get_args());
}

call_user_func_array sollte meiner Meinung nach veraltet sein, da es in mehrfacher Hinsicht überflüssig ist. Am offensichtlichsten ist dies für mich.

public function foo($arg,$arg1)
   call_user_func([$this, __FUNCTION__], ...func_get_args());
}

のことです。 ... ist recht nützlich (ich glaube, es funktioniert auch mit benannten Argumenten, obwohl ich das noch nicht ausprobiert habe).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X