PHP Variable nach return außerhalb von Funktion undefiniert

Picus

Lt. Commander
Registriert
März 2011
Beiträge
1.087
Hallo!

Folgender Code funktioniert einwandfrei:
Code:
function getQueryString($queryVar, $queryName) {
	$queryVar = 0;
	if (isset($_GET[$queryName])) { 
		$queryVar = $_GET[$queryName];
	}

	echo $queryVar;
}

getQueryString('$user_id', 'id');

Ich würde gerne später im Code die Variable $user_id wieder benutzen, weshalb ich den Code zu folgendem geändert habe:
Code:
function getQueryString($queryVar, $queryName) {
	$queryVar = 0;
	if (isset($_GET[$queryName])) { 
		$queryVar = $_GET[$queryName];
	}

	return $queryVar;
}

getQueryString('$user_id', 'id');
echo $user_id;

Leider ist dann die Variable $user_id nicht definiert. Wieso ist das so? Bzw wo liegt mein Fehler?
 
was macht der code eigentlich?
du übergibst als erstes argument den STRING "$user_id" aber das ist eh egal, da der wert direkt danach auf "0" gesetzt wird.
Ist dann in $_GET das Feld "$queryName" vorhanden setzt du $queryVar auf diesen Wert, sonst hat es 0.

Die ganze funktion erscheint mir sinnbefreit. Zumindest der erste Parameter ist unsinn.

Aber egal, dein zweites Beispiel musst du so ändern:

Code:
function getQueryString($queryVar, $queryName) {
	$queryVar = 0;
	if (isset($_GET[$queryName])) { 
		$queryVar = $_GET[$queryName];
	}
 
	return $queryVar;
}
 
$user_id = getQueryString('$user_id', 'id');
echo $user_id;

ich hoffe du filterst $_GET irgendwo....

zur erklärung:

return gibt einen Wert zurück. Das heißt dein aufruf von getQueryString() liefert als ergebnis einen Wert, der muss noch einer Variablen zugewiesen werden.

Ganz falsch, aber wohl am verständlichsten, kannst du dir das so vorstellen das der methoden name nach erfolgreichem aufruf durch den wert ersetzt wird, den return zurück gibt. Aber wenn du ihn nirgendswo zuweist steht er einfach so da und die nächste zeile wird ausgeführt.

Du scheinst den variablen namen als Parameter übergeben zu wollen.... das ist theoretisch möglich aber ein wenig komplizierter als das und auch nicht gerade sicher.
 
Zuletzt bearbeitet:
Warum nicht so? Das macht man über Return-Werte:
Code:
function getQueryString($queryName) {
	$queryVar = 0;
	if (isset($_GET[$queryName])) { 
		$queryVar = $_GET[$queryName];
	}
 
	return $queryVar;
}
 
$user_id = getQueryString('id');
echo $user_id;

Der Grund, warum dein obiger Code nicht das macht, was du dir erhoffst liegt daran: https://secure.php.net/manual/de/language.oop5.references.php

Was du also eigentlich machen willst: https://secure.php.net/manual/de/language.references.pass.php
bzw. in Code:
Code:
function getQueryString(&$queryVar, $queryName) {
	$queryVar = 0;
	if (isset($_GET[$queryName])) { 
		$queryVar = $_GET[$queryName];
	}
 
	return $queryVar;
}

$user_id = null;
getQueryString($user_id, 'id');
echo $user_id;
(ungetestet und mir nicht sicher, ob das geht - aber sollte)
 
ich glaube es müsste dann

Code:
getQueryString(&$user_id, 'id');
heißen und der Methoden Kopf bleibt unverändert. (das ist deprecated meine ich)
Aber referenzen zu übergeben, keine gute idee.
Es gingen noch Variable variable namen
Code:
$$var
usw. aber erstmal sollten wohl die basics sitzen
 
@CryNickSystems:
Du hast mich Verstanden, DANKE :D

Ich wollte für queryVar verschiedene Variablen einsetzen und mit der Parameterübergabe mit "&" funktioniert das.

@Mercsen:
Sorry für die Verwirrung... So sieht wie ich es geschrieben hab ist es in der Tat nur Schwachsinn :D
 
entschudligen muss man da nichts ;)

aber überdenke da lieber mal dein code designe!
Ich habs gerade nochmal nachgelesen, die definition im Methoden Kopf mit blabla(&$var) ist wiklich deprecated und sollte entsprechend nicht mehr benutzt werden.
Referenzen zu übergeben ist auch immer so eine Sache, es gibt nur wenig Beispiele wo das wirklich Sinn macht, in PHP z.b. bei prepared statements, ansonsten ist es einfach nur unsicher und Fehleranfällig und widerspricht der Kapselung.

Besser würde sich da doch ehr ein assoziativer Array machen, oder nicht?

aber ganz verstehen tue ich das immer noch nicht.

$queryVar nimmt doch den wert an, den du am ende haben willst?

Dann mach es lieber so:

Code:
function getQueryString($queryName) {
	$ret = 0;
	if (isset($_GET[$queryName])) { 
		$ret = $_GET[$queryName];
	}
 
	return $ret;
}
 
$user_id = getQueryString('id');
$user_Name = getQueryString('name');
$foo = getQueryString('foo');
$bar = getQueryString('bar');
echo $user_id;

macht das gleiche aber du musst keine referenzen hin und her schieben.
du musst der methode doch vorher nicht sagen in welcher variablen du das ergebnis haben willst, die soll dir nur irgendwas berechnen und einen wert geben den du dann nach belieben verwenden kannst.
 
Der Gedanke dahinter war folgender:
Ich brauche die Funktion nicht nur für die Variable $user_id sondern auch andere $x_id, $y_id.

Ergo wollte ich die Funktion so schreiben, so dass ich einfach immer die Variable einsetze die ich brauche und der entsprechende Wert gleich in den Variablen abgespeichert werden.

D.h. getQueryString($x_id, 'bla') speichert direkt den Wert von 'bla' in $x_id und getQueryString($y_id, 'blub') entsprechend den Wert von 'blub' in $y_id.

Natürlich kann ich es auch so schreiben:
Code:
[...]
	return $ret;
}

$user_id = getQueryString('id');

Aber dann müsste ich jedes Mal wenn ich den Wert einer anderen Variablen brauche die Funktion ausführen und danach noch die Variable abspeichern.

Ich hoffe man versteht halbwegs was ich meine... :freak:
 
ja das ist ganz typisch. Dann guck dir mein letztes beispiel an und teste es, das tut nämlich genau das ;)

wieso willst du denn folgendes schreiben:

Code:
$x_id; // muss ja vorher dekaliert werden wenn du eine referenz übergeben willst
getQueryString($x_id, 'bla')

(auch hier musst du da für jeden wert und jede variable die methode erneut ausführen.)

anstelle von

Code:
$x_id = getQueryString('id');

in beiden fällen hast du die variable $x_id mit dem Wert von $_GET['id'] gefüllt, aber der zweite code ist kürzer und kommt ohne referenzen aus. ;)

aber ohnehin würde mich mal genauer interessieren wozu du diese methode brauchst. Du hast die werte ja ohnehin schon in einem globalem super array ($_GET) und könntest direkt drauf zugreifen. Wieso der umweg über eine methode?
Dann lass doch lieber ganz am anfang des scripts eine methode laufen die alle Felder die du brauchst in $_GET prüft und ggf. auf 0 setzt (und da kannst dann auch gleich filtern um dir keinen fremdcode einzufangen).
So hast du sichergestellt das alles was du haben willst vorhanden ist.

und da mir gerade langweilig ist :D

Code:
$myFields = array('id', 'name', 'foo', 'bar');

foreach($myFields as $key => $value) {
    if(!isset($_GET[$value])) {
        $_GET[$value] = 0;
    } else {
        // hier könnte man auf unerlaubte zeichen filtern
    }
}

violá, du kannst sicher sein das alle deine felder vorhanden sind und direkt mit $_GET arbeiten.
 
Zuletzt bearbeitet:
Mercsen schrieb:
Ich habs gerade nochmal nachgelesen, die definition im Methoden Kopf mit blabla(&$var) ist wiklich deprecated und sollte entsprechend nicht mehr benutzt werden.

Nein, es ist genau andersrum - "&"-Zeichen beim Aufruf ist deprecated:
https://secure.php.net/manual/de/language.references.pass.php schrieb:
Zu beachten ist, dass kein Referenz-Zeichen beim Funktionsaufruf steht, nur in der Funktionsdefinition. Diese allein ist ausreichend, um das Argument per Referenz zu übergeben. In neueren PHP-Versionen gibt es eine Warnung, dass die Benutzung von "Call-time pass-by-reference" mit Hilfe von & in foo(&$a); veraltet ist.

Ich stimme dir aber zu, dass man hier keine Referenzen braucht und bspw. die Nutzung von Arrays bzw. dein letzter Vorschlag sauberer wäre.
 
CryNickSystems schrieb:
Nein, es ist genau andersrum - "&"-Zeichen beim Aufruf ist deprecated:


Ich stimme dir aber zu, dass man hier keine Referenzen braucht und bspw. die Nutzung von Arrays bzw. dein letzter Vorschlag sauberer wäre.

großer gott! XD
wie kann man sich nur so verlesen! Ja du hast recht, man liest manchesmal eben auch nur das was man will :D
Hatte kurz in eine Klasse von mir reingeschaut die als mysqli wrapper fungiert, da musste ich mit referenzen rumjonglieren weil die statements ja sonst net laufen und hab meinen eigenen code falsch gelesen :p
Aber jetzt erinnere ich mich wieder das er wirklich gemeckert hatte als ich refrenzen übergeben wollte und daher jetzt einen array mit referenzen übergebe (jaja da ist php doch ein wenig doof :p)

macht das ganze aber auch wirklich unlesbar, wenn man dann nicht weiß das die methode ne referenz annimmt kann einem das ganz schnell ne iteration zerschießen xD
 
Es gibt nur wenige Gründe, warum etwas per Referenz an eine Funktion übergeben werden sollte, und was du da hast ist definitiv keiner. Gründe für Referenzaufrufe sind eigentlich ausschließlich Speicherersparnis und Performance, und keins von beiden ist hier gegeben (und bevor du nicht mit Arrays im Bereich von mehr als 100 MB oder riesigen Strings hantierst, wirst du das auch kaum brauchen).

$user_id = getQueryString('bla');
$y = getQueryString('blub');

macht genau was du willst, und wenn du in 2 Jahren an der Stelle vorbei kommst, weißt du -> aha, $user_id bekommt seinen Wert aus der Funktion getQueryString. Bei getQueryString($user_id, 'bla'); weißt du erstmal gar nichts, im Zweifel müssen du und jeder Kollege der das jemals anfasst, jedesmal erst in die getQueryString Funktion gucken, um zu sehen wtf da eigentlich passiert.

Sprich man kann das schon so machen, aber es ist gegen jeden guten Stil und wenn ich über solchen Code stolpern würde, würde ich die Referenz direkt rauswerfen und einen netten Kommentar über die Mutter des Autors hinterlassen....
 
Habe im Endeffekt nicht ganz Begriffen, wie Rückgabewerte einer Funktion funktionieren.

Jetzt funktioniert das ganze ohne Referenz, nochmal vielen Dank an alle! :)
 

Ähnliche Themen

Zurück
Oben