Für Menschen · Seien Sie begeistert und Sie werden begeistern !
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.
<?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();
?>
<?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;
?>
<?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;
?>
bueltge.de [by:ltge.de] wird von Frank Bültge geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.
Das Weblog wird angetrieben von WordPress und aktuell gibt es 980 Beiträge, 18722 Kommentare in 14 Kategorien und 464 Tags.
Das Blog wird liebevoll mit xHTML & CSS in Handarbeit gestaltet. Erstellt mit ♥ zum Befüllen und Erhalten.
Design und Code ist unter Copyright
© 2001 - 2012 bueltge.de [by:ltge.de]
22. März 2006 um 12:44
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
22. März 2006 um 13:04
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
28. Juli 2006 um 16:14
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 (-:
31. Dezember 2006 um 19:23
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. September 2007 um 16:44
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. September 2007 um 23:34
Du sollstest das so machen:
class blub { function FunkUebergabe() { return 4; } } $x = new blub; $myFunc = $x->FunkUebergabe(); echo $myFunc;Funktioniert 100%
25. Januar 2008 um 13:56
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=3auf. 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
12. Februar 2008 um 20:27
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
24. März 2008 um 18:08
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?
25. März 2008 um 12:00
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.
25. März 2008 um 13:57
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
25. März 2008 um 14:44
Klappt also, wozu möchtest du überhaupt auf 25 Zeichen einschränken?
25. März 2008 um 15:50
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.
22. Juli 2008 um 15:24
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
26. Januar 2011 um 14:06
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");
31. März 2011 um 11:14
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);
22. November 2011 um 14:25
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:-(
24. November 2011 um 08:46
@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