Sidebar
ein-/ausblenden

PHP - Übergabe einer Funktion an eine Variable

Plugin für WordPress SEO

Anzeige

Funktionen können ohne weiteres an Variablen übergeben werden, so lassen sich diese auch schnell mit wenig Code wieder aufrufen. Die zwei folgenden Beispiele sollen dies verdeutlichen und mir als Gedächtnisstütze dienen. Im ersten Beispiel wird, ganz simpel, die Funktion "FunkUebergabe" an die Variabel $myFunc übergeben.
Im zweiten Beispiel übergeben wir die Funktion mit einem Parameter $para, genannt "call by value".
call by value - Werte werden an eine Funktion per Kopie übergeben. Die Funktion kann somit die ursprüngliche Variable nicht ändern.
Im dritten Beispiel übergeben wir den Parameter mit Referenz, damit ändert sich die Variable außerhalb der Funktion.
call by reference - Werte werden an eine Funktion per Referenz übergeben und nicht kopiert. Die Funktion kann somit die ursprüngliche Variable ändern.

Beispiel 1:


<?php

/**
 * Übergabe einer Funktion an eine Variable
 */

function FunkUebergabe(){
	echo 'Übergabe für eine Test';
}
$myFunc = 'FunkUebergabe';
echo "Folgende Zeile ist der Inhalt der Funktion \"FunkUebergabe\"\n" ;
echo $myFunc();
?>

Beispiel 2:


<?php

/**
 * Übergabe einer Funktion an eine Variable mit Parameter
 */

function FunkUebergabe($para){
	$para++;
	return $para;
}
$para1 = 100;
$myFunc = FunkUebergabe($para1);
echo 'Inhalt der Variable para1'."\n";
echo $para1."\n";
echo 'Folgende Zeile ist der Inhalt der Funktion "FunkUebergabe" mit Parameter'."\n";
echo $myFunc;
?>

Beispiel 3:


<?php

/**
 * Übergabe einer Funktion an eine Variable mit Parameterreferenz
 */

function FunkUebergabe(&$para){
	$para++;
	return $para;
}
$para1 = 100;
$myFunc = FunkUebergabe($para1);
echo 'Inhalt der Variable para1 ändert sich auch'."\n";
echo $para1."\n";
echo 'Folgende Zeile ist der Inhalt der Funktion "FunkUebergabe" mit Parameter'."\n";
echo $myFunc;
?>

18 Kommentare zu „PHP - Übergabe einer Funktion an eine Variable“

  1. 1
    Kommentar von Flo

    Hi, wusste noch gar nicht das man bei PHP Funktionen an Variablen übergeben kann. Man lernt nie aus.
    Aber kann es sein, dass bei den letzten beiden Beispielen, jeweils in der letzten Zeile, das Klammernpaar hinter $myFunc fehlt?

    Ciao Flo

  2. 2
    Kommentar von Frank Bültge

    nein, die fehlen nicht. Hier wird der Inhalt der Variable myFunc ausgegeben. In dem Fall die Funktion, die vorher an die Variable myfunc übergeben wurde.
    Aber danke der Nachfrage, bin immer wieder für Hinweise dankbar.

    LG Frank

  3. 3
    Kommentar von Benjamin

    Hi,
    also Beispiel 1 ist mir auch neu, und ich bin fast schon ein alter Hase in PHP.
    Aber Bsp. 2 und 3 sind doch ganz einfache Funktionsaufrufe ? oder ?
    LOL Habe auch erst ein wenig Zeit gebrauch bis ich das gesehen habe (-:

  4. 4
    Kommentar von Max

    Hi, leider kann man mit Beispiel 1&2 nur solange etwas anfangen, bis man versucht Schleifen zu benutzen. Beispielsweise bei einer While-Schleife, welche mit mysql_fetch_array() mehrere Werte aus einer Datenbank liest und ausliest, gibt die Variable immer nur den ersten Schritt der Schleife aus.
    Vlt sollte man das noch hinzufügen.

    lg

  5. 5
    Kommentar von Felix Gaube

    Kann ich diese tolle Funktion von php auch nutzen, wenn ich eine Methode einer anderen Klasse referenziere? Also soetwas:

    class blub {function FunkUebergabe(){return 4;}}
    ---
    $x= new blub();
    $myFunc = $x->FunkUebergabe();
    echo $myFunc();

    (Wie) Kann man soetwas realisieren???

  6. 6
    Kommentar von Max

    Du sollstest das so machen:

    class blub
    {
        function FunkUebergabe()
        {
            return 4;
        }
    }
    
    $x = new blub;
    $myFunc = $x->FunkUebergabe();
    echo $myFunc;

    Funktioniert 100%

  7. 7
    Kommentar von Nicolas

    Hallo,

    ich weiß nicht ob ich hier genau richtig bin für meine Frage. Ich möchte gerne den Bogen zu WordPress spannen: Ist es möglich einen Query-String durch WordPress zu "schleifen".

    Ein kleines Beispiel:
    Jemand ruft meine Webseite mit http://www.wordpress-seite.de?id=3 auf. Wie kann ich den ID-Query-String ständig durch alle Seiten / Einträge / Archive mitübergeben? - Solang bis dieser Query-String für mich von Interesse ist.

    Vielleicht ist die eigentliche Frage auch: Wie gehe ich in WordPress mit globalen Variablen um bzw. nütze diese sinnvoll.

    Wie man vielleicht sieht, habe ich ein paar Grundkenntnisse in PHP und WordPress (-Backend), allerdings nicht in letzter Konsequenz. Ich wäre sehr dankbar, wenn ich einen Schritt weiter käme.

    Viele Grüße

  8. 8
    Kommentar von Michael

    Hallo Zusammen,

    das erste Beispiel ist richtig, aber Beispiel zwei und drei haben mit Funktionszeigern überhaupt nichts zu tun. Sind ganz gewöhnliche Funktionsaufrufe. Die Variable speichert den Rückgabewert und gibt ihn dann aus. Das klappt natürlich auch mit der Übergabe per Referenz. Sorry for that! ;-)

    Beste Grüße,
    Michael

  9. 9
    Kommentar von Sebastian

    Hallo Frank,

    ich hoffe mit Deiner Funktion das machen zu können was ich vor habe. Ich möchte die Titel in WordPress bereits nach 25 Buchstaben kürzen und habe dazu in der Template functions.php eine Funktion geschrieben:


    function ShortenText($text)
    {
    // Change to the number of characters you want to display
    $chars = 25; $text = $text." ";
    $text = substr($text,0,$chars);
    $text = substr($text,0,strrpos($text,' '));
    $text = $text."..."; return $text;

    }

    In meinem Loop wollte ich dann the_title() einfach kürzen und ausgeben durch:


    $shorttitle = ShortenText(the_title());
    echo $shorttitle;

    Aber leider funktioniert das nicht. Mit Deiner Variante bekomme ich allerdings zusätzlich noch die Fehlermeldung: "funkuebergabe() previously declared in....."

    Hast Du eine Idee?

  10. 10
    Kommentar von Frank Bültge

    Aufpassen, die Funktion the_title sorgt für eine direkte Ausgabe, incl. echo, siehe post-template.php.
    Das Kürzen mittels substr() sollte reichen, allerdings muss die Funktion get_the_title genutzt werden, die aber noch keine Parameter akzeptiert.

  11. 11
    Kommentar von Sebastian

    hallo frank, danke für deine hilfe. ich habe die lösung für mein problem veröffentlicht.

    WordPress: Shorten the title of posts or everything else you want

  12. 12
    Kommentar von Frank Bültge

    Klappt also, wozu möchtest du überhaupt auf 25 Zeichen einschränken?

  13. 13
    Kommentar von Sebastian

    ich habe es auf einer anderen seite umgesetzt (noch nicht öffentlich). ich hatte auf der startseite die ersten 5 artikel mit titel und auszug ausgegeben und die nächsten 5 als liste mit datum und anzahl der kommentare. dadurch war die zeile zu lang und das layout zerschossen. durch die kürzung konnte ich das problem verhindern.

  14. 14
    Kommentar von 3rdInvisible

    man könnte auch folgende dinge anstellen

    function paragraph($text)
    {
    echo "" . $text . "";
    }

    class HTML_OUT
    {
    function paragraph($text)
    {
    echo sprintf("%s",$text);
    }
    }

    class TEXT_OUT
    {
    function paragraph($text)
    {
    echo $text."\r";
    }
    }

    $remote="paragraph";

    $remote("using function:paragraph !");

    HTML_OUT::$remote("using function:paragraph from class HTML_OUT");

    TEXT_OUT::$remote("using function:paragraph from class TEXT_OUT");

    gr33tz 3rdInvisible

  15. 15
    Kommentar von Simon Berger

    Ich bin auf der Suche nach einer Funktionsübergabe in PHP hierauf gestoßen.
    Ich möchte mich mit diesem Posting auf die Kommentare #2 und #8 beziehen, die schon richtig festgestellt haben, dass die Beispiele 2 und 3 wenig bis gar keinen Sinn machen. Das ist eine Normale Funktionsrückgabe. Das verwirrt nur und ist doch auch keine Lösung für den Anwendungsfall Funktionsübergabe.

    Beispiele 2 und 3 sind aber absolut ebenso umsetzbar wie Beispiel 1.

    Beispiel 2

    function ausgabe($param) {
    echo $param;
    }

    $func = "ausgabe";

    $func("Test123");

  16. 16
    Kommentar von Danaos

    Ein Beispiel für eine Klasse, mit der man Funktionen sammeln, und über eine festgelegte ID wieder aufrufen kann. Dies kann verwendet werden, wenn erst zur Laufzeit entschieden wird, welche Funktionen ausgeführt werden sollen. Diese informationen könnten aus einer Konfigurationsdatei geladen werden. Dies erspart eine ganze Reihe IF-ELSE Anweisungen.
    Ähnliches passiert in der Dependency Injection Componente von Symfony 2

    class funcCollect{

    private $funcs = array();

    /** add a new function */
    public function addFunc($id, $function)
    {
    if (is_callable($function)) {
    $this->funcs[$id] = $function;
    return true;
    } else {
    return false;
    }
    }

    /** run defined functions */
    public function runFunc($id)
    {
    if (isset($this->funcs[$id])) {
    return $this->funcs[$id]();
    } else {
    return false;
    }
    }
    }

    function foo() {
    return "foo";
    }

    $test = new funcCollect();

    /** closure */
    $test->addFunc(1, function() {return "test";});
    $test->addFunc(2, "foo");

    print $test->runFunc(1);
    print $test->runFunc(2);

  17. 17
    Kommentar von SW

    Aufpassen, die Funktion the_title sorgt für eine direkte Ausgabe, incl. echo, siehe post-template.php.
    Das Kürzen mittels substr() sollte reichen

    Hm, kann ich damit irgwndwie die "direkte Ausgabe" verhindern?

    Ich bastel grad an der wp_nav_menu() rum, und hab versucht das in eine Variable umzuleiten. Das hat allerdings nicht funktioniert, vielmehr kam immer ne Ausgabe.

    $test = wp_nav_menu()

    Die Variable war dann leer:-(

  18. 18
    Kommentar von Frank Bültge

    @SW: ja, the_title() hat beispielsweise einen Paramete rum das Echo zu unterdrücken, siehe Codex: the_title( '<h3>', '</h3>', FALSE );
    Alternativ passen oft die Kind-Funktionen mit get_*. Die Funktion wp_nav_menu() hat ebenso einen Parameter, der die direkte Ausgabe deaktiviert: echo => FALSE, siehe Codex

Kommentare sind geschlossen.