PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktionen und "global"



Xerxes
25-01-2003, 21:09
Habe ein kleines Problem mit dem Geltungsbereich von Variablen in Funktionen zusammen mit global.
Und zwar habe ich mir mal eine Funktion geschrieben, die mir Variablen aus dem $_REQUEST in mein Script importiert.
Das ganze Funktioniert eigentlich auch ganz gut (siehe Script).

Mein Problem: Rufe ich die Funktion import_vars() in einer Funktion auf, hab ich die Variablen nicht.
Wenn ich mich richtig an den Geltungsbreich von variablen erinner, stehen mir die von import_vars() importierten Variablen nur in dieser Funktion selbst und auf Globaler ebene zur Verfügung, oder?
Gibt es eine Möglichkeit, dass die Variablen auch in einer anderen Funktion nutzen kann, ohne sie dort alle manuell per global $var1, $var2, ...; reinzuholen? Die Anzahl der benötigten Variablen kann nämlich manchmal recht groß sein....


$import_vars = array(
'var1',
'var2',
);

// Funktioniert super:
import_vars( $import_vars );
echo $var1 . $var2;

//Funktioniert nicht:
foo( $import_vars );

function foo( &$vars )
{
import_vars( $vars );
echo $var1 . $var2;
}

//
// Imports all variabless contained in $var_names from the $_REQUEST array
//
function import_vars( $var_names )
{
for( $i = 0; $i < count( $var_names ); $i ++ )
{
global ${$var_names[$i]};
${$var_names[$i]} = isset( $_REQUEST[$var_names[$i]] ) ? $_REQUEST[$var_names[$i]] : NULL;
}

return true;
} // end function import_vars()

Gaert
25-01-2003, 21:47
Warum machst du´s nicht mit dem $GLOBALS[] Array?

Also sowas in der Art




global $import_vars;
$GLOBALS['import_vars'] = array(
'var1',
'var2',
);

....

import_vars( $import_vars );
echo $GLOBALS['var1'] . $GLOBALS['var2'];

....

foo( $import_vars );

function foo( &$vars )
{
import_vars( $vars );
echo $GLOBALS['var1'] . $GLOBALS['var2'];
}


//
// Imports all variabless contained in $var_names from the $_REQUEST array
//
function import_vars( $var_names )
{
foreach($var_names as $var)
{
global $$var;
$GLOBALS[$var] = isset( $_REQUEST[$var] ) ? $_REQUEST[$var] : NULL;
}
return true;
} // end function import_vars()


Habs nicht getestet sollte aber funktionieren...
Wäre aber nett, wenn du mir den Sinn der Übung mal erklären könntest!

mehlvogel
25-01-2003, 21:58
Oder in etwa so:



@extract($_REQUEST);


Aber was der Sinn ist, weis ich auch net - ne Erklärung wäre cool.

Xerxes
26-01-2003, 01:47
Der Sinn des ganzen: Ich arbeite grad an einer Art sehr flexiblen CMS und hab da für jedes Modul je drei funktionen, die mehrere sql-statements zurückgeben (eine für inserts, updates und deletes).
in jeder dieser drei Funktionen brauche ich natürlich immer den Inhalt des Formulars. Da dieses Formular aber teilweise sehr viele Felder enthalten kann, finde ich es ziehmlich kacke, in jeder der drei funktionen alle variablen aus $_REQUEST zu extrahieren.
Und ich will auch nicht die ganze zeit mit $_REQUEST['var'] arbeiten, weil mir das zu viel tipparbeit ist...

mehlvogel
26-01-2003, 08:30
Dann entpack die Variablen einfach einmal komplett global und greif in den Funktionen drauf zu. Obwohl es am speicherschonendesten damit ginge das ganze über den $_REQUEST zu machen. Generell würd ich vorher Prüfen ob nicht vielleicht register_globals on ist - dann kannst dir das ganze nämlich sparen ;)

Schau vielleicht auch mal auf der PHP Seite zum Thema Variables Scope - da sind einige interessante User Comments

Gaert
26-01-2003, 09:21
Und ich will auch nicht die ganze zeit mit $_REQUEST['var'] arbeiten, weil mir das zu viel tipparbeit ist...

Naja... es wäre auf jeden fall ein sauberer Programmierstil, wenn du mit $GLOBALS[] und dem $_[] Arrays Arbeiten würdest. Der Mehraufwand macht sich in Sachen übersichtlichkeit und lesbarkeit auf jeden Fall bezahlt und ist auch nicht so fehleranfällig.