php - Variable aus Funktion übernehmen

G.P.

Legendäres Mitglied
Ich habe ein vorhandenes Programm in welchen ich den Code kaum ändern darf.

An einer Stelle wird eine Funktion aufgerufen und in der Funktion wird eine der übergebenen Variablen manipuliert.
Gibt es eine möglichkeit diesen manipulierte Variable ausserhalb der Funktion auszulesen, ohne sie mit return innerhalb der Funktion zurückzugeben?

Beispiel:
CODE
function test($wert1, $wert2)
{
$wert1++;
$wert2+4;

return $wert1;
}

echo test($wert1,$wert2);

//Hier moechte ich auch den geanderten Wert von $wert2 ausgeben
echo $wert2;

 
Ich würde für sowas wahrscheinlich statische Klassen (also statische Methode/Variablen) verwenden! global ist sehr unschön...
 
Global geht nur um externe Werte in einer Funktion zu lesen, aber leider nicht umgedreht
sad.gif


@adrian
ich darf die Funktion nicht umschreiben (bzw. nur sehr minimal)
 
Referenz verwenden:
CODE
function test($wert1, &$wert2)
{
$wert1++;
$wert2+4;

return $wert1;
}
echo test($wert1, &$wert2);

//Hier moechte ich auch den geanderten Wert von $wert2 ausgeben
echo $wert2;




Per Global:

CODE
function test($wert1, $wert2)
{
$wert1++;
$wert2+4;
$GLOBALS['func_test_wert2'] = $wert2;

return $wert1;
}
echo test($wert1,$wert2);

//Hier moechte ich auch den geanderten Wert von $wert2 ausgeben
echo $GLOBALS['func_test_wert2'];




Mix aus Global und Extrafunktion:

CODE
function test($wert1, $wert2)
{
$wert1++;
$wert2+4;
$GLOBALS['func_test_wert2'] = $wert2;

return $wert1;
}
function getTestWert2() {
return (isset($GLOBALS['func_test_wert2'])) ? $GLOBALS['func_test_wert2'] : null;
}
echo test($wert1,$wert2);

//Hier moechte ich auch den geanderten Wert von $wert2 ausgeben
echo getTestWert2();

 
Wie wärs mit OO?

Etwas vereinfacht:
CODE class Test
 {
   public $wert1;
   public $wert2;
 
   function __construct() {
         $this->wert1 = 0;
         $this->wert2 = 0;
   }


   public function berechnen()
  {
         $this->wert1++;
         $this->wert2 = $this->wert2 +4;
   }
}

$foo = new Test();
$foo->wert1 = 3;
$foo->wert2 = 7;

$foo->berechnen();

echo $foo->wert2;

 
Du könntest eine "Datenspeicherklasse" machen mit einem Singleton und dort den Wert zwischenspeichern (dann musst du die Methodensignatur nicht ändern)...
gruäss adrian
 
Danke für eure Hilfe und die vielen Vorschläge.
Es klappt jetzt alles bestens
biggrin.gif


 
QUOTE (wichtl @ Fr 24.07.2009, 09:00) Referenz verwenden:

CODE
function test($wert1, &$wert2)
{
}


Per Global:

CODE
function test($wert1, $wert2)
{
$GLOBALS['func_test_wert2'] = $wert2;
}




das Problem bei "Global" ist, das dadurch die $var "reingeholt" wird, wozu sie erstmal existieren muß, erzeugen kann man sie also nicht

Lösung


CODE
$wert2=$varDiichspäterbrauche='jetztnochunwichtig';

function test($wert1, $wert2)
{
global $wert2;
$wert2 += $wert1&#59;
}
echo($wert2);




? das "Referentz" .... &$wert2 .... = das was man in C "Pointer" nannte?
(bei C war das mit Global Andersrum .... alle $Variablen waren in Funktionen vorhanden, wollte man eine FunktionsInterneVariable die nur hier gilt dann



CODE
$wert2=$varDiichspäterbrauche='jetztnochunwichtig';

// beispiel für "C"
// wobei in "C" die ZahlenVariablen eigentlich ohne $ sind

function V1 ($wert1, $wert2)
{
$Ergebnis = $wert1 + $wert2;
}

function V2 ($wert1, $wert2)
{
local $Ergebnis;
$Ergebnis = $wert1 + $wert2;
}

V1( 1, 2 ); echo ( $Ergebnis );
V2( 5, 6 ); echo ( $Ergebnis );


=
3
3 (weil das 5+6 nur Funktionsintern)
 
QUOTE (800XE @ Sa 25.07.2009, 21:29) ? das "Referentz" .... &$wert2 .... = das was man in  C "Pointer" nannte?
(bei C war das mit Global Andersrum .... alle $Variablen waren in Funktionen vorhanden, wollte man eine FunktionsInterneVariable die nur hier gilt dann

Pointer != Referenz

http://www-alt.physik.uni-muenchen.de/kurs..._07/node13.html


In PHP gibt es keine Pointer, in C++ gibt es sowohl Pointer (*) als auch Referenzen (&).
 
QUOTE (Sascha Ahlers @ Mo 27.07.2009, 13:28) Pointer != Referenz



QUOTE
Im Gegensatz zu expliziten Zeigern ist die Adresse selbst nicht mehr änderbar



Ich würde mal sagen sie sind das selbe
im Sinne von "es wird kein String über den Stack geschoben, nur die Adresse zu dem String; daraus ergibt sich das Änderungen an dem String auch auserhalb der Funktion statfinden; bei einer STringübergabe müßte diese ja im Return() zurückgegeben werden oder über eine Globale Variable nach ausen geschrieben werden"


Unterschied Pointer Refezentz
Die "PointerAdresse"(als referentz) läst sich nicht ändern ...... das hat mir mal 2 tage Fehlersuche bereitet
Hatte mir eine Datenbank geschrieben und die ist prlötzlich(manchmal) abgestützt
Habe 2 Tage an der "Absturzstelle" gesucht und den Fehler nicht gefunden, weil dort auch keiner War
Eine Andere Routine hat das Array nicht über
[$i]
sondern über
*datenbank += $i
durschlaufen und so war der Pointer dann am Ende des Speichers und die Andere Routine hat dann über $datenbank[$i] auf Speicher dahinter zugegrieffen (was sie nicht durfte = BussERROR)


Referentz = Pointer mit eigebautem Sicherheitsgurt (oder so)
 
Zurück
Oben