G.P. 1 Report post Posted July 23, 2009 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 ausgebenecho $wert2; Share this post Link to post Share on other sites
Soka 0 Report post Posted July 23, 2009 Versuch es mal mit globalCODE function test($wert1, $wert2){ global $wert2; $wert1++; $wert2+4; return $wert1;}echo test($wert1,$wert2);//Hier moechte ich auch den geanderten Wert von $wert2 ausgebenecho $wert2;http://de2.php.net/manual/en/language.variables.scope.php Share this post Link to post Share on other sites
Adrian der Grosse 0 Report post Posted July 23, 2009 Ich würde für sowas wahrscheinlich statische Klassen (also statische Methode/Variablen) verwenden! global ist sehr unschön... Share this post Link to post Share on other sites
G.P. 1 Report post Posted July 23, 2009 Global geht nur um externe Werte in einer Funktion zu lesen, aber leider nicht umgedreht @adrianich darf die Funktion nicht umschreiben (bzw. nur sehr minimal) Share this post Link to post Share on other sites
wichtl 0 Report post Posted July 24, 2009 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 ausgebenecho $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 ausgebenecho $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 ausgebenecho getTestWert2(); Share this post Link to post Share on other sites
Michael Bieri 0 Report post Posted July 24, 2009 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; Share this post Link to post Share on other sites
Adrian der Grosse 0 Report post Posted July 24, 2009 Du könntest eine "Datenspeicherklasse" machen mit einem Singleton und dort den Wert zwischenspeichern (dann musst du die Methodensignatur nicht ändern)...gruäss adrian Share this post Link to post Share on other sites
G.P. 1 Report post Posted July 24, 2009 Danke für eure Hilfe und die vielen Vorschläge.Es klappt jetzt alles bestens Share this post Link to post Share on other sites
800XE 3 Report post Posted July 25, 2009 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 nichtLösungCODE $wert2=$varDiichspäterbrauche='jetztnochunwichtig';function test($wert1, $wert2){ global $wert2; $wert2 += $wert1;}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 dannCODE $wert2=$varDiichspäterbrauche='jetztnochunwichtig';// beispiel für "C"// wobei in "C" die ZahlenVariablen eigentlich ohne $ sindfunction 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 );= 33 (weil das 5+6 nur Funktionsintern) Share this post Link to post Share on other sites
Sascha Ahlers 0 Report post Posted July 27, 2009 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 != Referenzhttp://www-alt.physik.uni-muenchen.de/kurs..._07/node13.htmlIn PHP gibt es keine Pointer, in C++ gibt es sowohl Pointer (*) als auch Referenzen (&). Share this post Link to post Share on other sites
800XE 3 Report post Posted July 27, 2009 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 selbeim 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 RefezentzDie "PointerAdresse"(als referentz) läst sich nicht ändern ...... das hat mir mal 2 tage Fehlersuche bereitetHatte mir eine Datenbank geschrieben und die ist prlötzlich(manchmal) abgestütztHabe 2 Tage an der "Absturzstelle" gesucht und den Fehler nicht gefunden, weil dort auch keiner WarEine Andere Routine hat das Array nicht über [$i] sondern über *datenbank += $idurschlaufen 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) Share this post Link to post Share on other sites