2016-07-11 16 views
0

Ich habe Zweifel, dass vielleicht jemand hier antworten kann. Mein Code funktioniert gut, aber ich bin sicher, ich mache es irgendwie falsch. Es muss einen einfacheren und saubereren Weg geben, um es zu erreichen.So rufen Sie eine Funktion mit Argumenten in einer Funktion mit Argumenten auf

Angenommen, diese Klasse:

class myClass { 
    public static function myFunctionOne ($arg_one, $arg_two, $arg_tree) { 
     echo $arg_one; 
     myClass::$arg_two($arg_tree); 
    } 
    public static function myFunctionTwo ($arg_four) { 
     echo $arg_four; 
    } 
} 

Dann rufen Sie oben Klasse irgendwo (mein Fall eines HTML-Menü in einer PHP-Datei erstellt), wie die folgenden:

myClass::myFunctionOne('echo a string', 'myFunctionTwo', 'echo forth value'); 

Dies funktioniert gut, und es Ausgänge:

echo a string echo forth value 

Aber ist es legitim?

Es sieht für mich skizzenhaft aus. Kann ich Funktionen wie diese verwenden, um eine Funktion mit Argumetn in einer Funktion mit Argumenten aufzurufen?

+1

Ja, es ist echt. So können Sie Funktionen abhängig von Benutzereingaben dynamisch aufrufen. Sie können auch http://php.net/manual/de/function.call-user-func.php ausprobieren. Die andere Frage ist: Brauchen Sie wirklich dynamische Funktionsaufrufe? Meistens ** nicht **. – Xatenev

+0

Nun, ich bin mir fast sicher, ich könnte es anders machen, aber der obige Fall ist nur ein kurzer Auszug dessen, was ich mache. Ich versuche gerade, etwas OOP zu lernen (und ja, oben ist alles außer OOP ich nehme an: P). Das obige ist nur ein kleiner Teil eines größeren Bootstrap-Akkordeons, in dem ich Tab-IDs und hrefs erstellen möchte, aber ALSO Call Body und Menütitel mit der gleichen Funktion in einem, indem ich nur die Argumente ändere. Wahrscheinlich gibt es bessere Möglichkeiten, aber man lernt auf dem Weg :) Vielen Dank für die Bestätigung, dass es eine legitime Art ist, und nicht ein "es funktioniert casual" Fall :) – smileBeda

+0

Das funktioniert sicher. – peter

Antwort

2

Können Sie das tun? Absolut. Sollten Sie das tun? Vielleicht nicht.

In PHP heißt das Variable Functions. Grundsätzlich wird jede Variable mit ( als Name einer Funktion oder Methode zum Aufrufen verwendet.

Wenn Sie mehrere Argumente übergeben müssen, können Sie die Argumente der letzten Funktion als Array übergeben und anschließend das Array entpacken, wenn Sie die letzte Variablenfunktion aufrufen.

Es kann jedoch aus anderen Gründen nicht ein gutes Design-Muster sein, und dies kann den Code schwierig zu pflegen machen. Es verletzt wahrscheinlich den Principal von Abstraction für Anrufer von myClass::myFunctionOne() zu wissen, welche Methoden/Funktionen myClass hat und welche Argumente sie nehmen.

Beachten Sie, dass ich hier den Begriff "Funktion" verwende, aber wenn es in einer Klasse ist, wird es als eine "Methode" bezeichnet.

+0

Beachten Sie, dass Sie auch' self :: myFunctionOne() 'anstelle von' myClass :: myFunctionOne() 'verwenden können. – Will

+0

aber selbst :: würde nur innerhalb der Klasse arbeiten, oder? Ich rufe die Klasse in einer separaten Datei auf. – smileBeda

+1

Korrigieren. 'self ::' ist nur für innerhalb der Klasse, wie in Ihrem Beispiel. Also lassen Sie es so, wie Sie es für einen externen statischen Anruf haben, wie Sie es nennen. – Will

Verwandte Themen