Sign in to follow this  
G.P.

php - Variable aus Funktion übernehmen

Recommended Posts

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;

Share this post


Link to post
Share on other sites
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)

Share this post


Link to post
Share on other sites
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();

Share this post


Link to post
Share on other sites
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
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
Danke für eure Hilfe und die vielen Vorschläge.
Es klappt jetzt alles bestens biggrin.gif

Share this post


Link to post
Share on other sites
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;
}
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)

Share this post


Link to post
Share on other sites
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 (&).

Share this post


Link to post
Share on other sites
QUOTE (Sascha Ahlers @ Mo 27.07.2009, 13:28)

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)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this