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.

11voto

Felix Kling Punkte 751464

Sie können Folgendes nutzen variable Funktionen und deklarieren Sie eine Variable mit dem Funktionsnamen am Anfang Ihrer Funktion (oder wo auch immer). Keine Notwendigkeit für call_user_func :

function test($i) {
   $__name = __FUNCTION__;
   if($i > 5) {
       echo $i. "\n";
       $__name($i-1);
   }
}

Vergessen Sie nicht, dass die Verwendung des real Funktionsname ist wahrscheinlich für andere Leute besser lesbar :)
(zumindest einen Kommentar abgeben warum Sie dies tun)


Update :
Wie @Alix in seinem Kommentar erwähnt, könnte es sinnvoll sein, Folgendes zu deklarieren $__name と言って static . Auf diese Weise wird der Wert der Variablen nicht immer wieder neu zugewiesen.

5voto

Alix Axel Punkte 146320

Ich weiß nicht, warum das hässlich ist:

return call_user_func_array(__FUNCTION__, func_get_args());

Versus:

return call_user_func_array('someFunction', func_get_args());

Sie müssen weiterhin call_user_func_array() wenn Sie den Wartungsaufwand verringern wollen (wenn Ihre Funktionen [viele / eine unterschiedliche Anzahl] von Argumenten haben).

Abgesehen davon Ich sehe keinen anderen Weg . Auch kann eine statische Methode nicht auf sich selbst verweisen, indem sie self:: nur für seine Klasse. Sie müssten auch die magische __METHOD__ ständig, um das zu tun.

3voto

Loading Punkte 89
function anyfunc() {
    __FUNCTION__();
}

wenn im Unterricht verwendet:

protected function anymethod() {
    $this->{__FUNCTION__}();
}

0voto

aowie1 Punkte 826

Für diejenigen unter Ihnen, die dies innerhalb einer statischen Methode tun wollen:

forward_static_call(array('self', __METHOD__), $arg1, $arg2, $etc);

Auf diese Weise, wenn die Methode umbenannt wird, müssen Sie sich nicht darum kümmern, alle Rekursionsaufrufe innerhalb der Methode zu ändern.

0voto

mu3 Punkte 589
function self(){
  return call_user_func_array(debug_backtrace()[1]['function'], func_get_args());
}

function test($i) {
    if($i) {
        echo "$i<br>\n";
        self($i-1);
    }
}
test(5);

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