Geltungsbereich von Variablen, Bsp. Frage
Thomas*
- php
Hallo,
unter: http://www.php.net/manual/de/language.variables.scope.php gibt es das Beispiel 12-1:
1. Ich verstehe nicht, warum ich Summe(); brauche für echo $b; ?
Beispiel 12-1. Die Verwendung von global"
<?php
$a = 1;
$b = 2;
function Summe()
{
global $a, $b;
$b = $a + $b;
}
Summe();
echo $b; // gibt 3 aus
?>
Mein Bsp.:
2. Wie krieg ich $i1 aus der for-Schleife raus, in meinen Dateinamen?
3. Und warum hab ich $URLs außerhalb der for-Schleife auch ohne global?
$i1=0;
for($i1=20060101; $i1<=20060131; $i1++)
{ global $i1;
$URLs[] = "http://.com/statistics/online.html?busdate=".($i1)."type=C&expiry=200603";
}
// usw. usw.
if($snoopy->fetch("$URLs[$i2]"))
{
echo "response code:<br> ".$snoopy->response_code."<br>\n";
while(list($key,$val) = each($snoopy->headers))
echo $key.": ".$val."<br>\n";
$headers = $snoopy->headers;
}
// usw. usw.
$HTML5 = $snoopy->results;
// Dateien erzeugen
$filename = "C_stats_from"."$i1";
$filename .= date("Ymd-His"); // erzeugt dateinamen mit datum und uhrzeit
$Datei = "$filename.htm";
$FilePointer = fopen($Datei, "w");
fwrite($FilePointer, $HTML5);
fclose($FilePointer);
Ich blick das irgendwie gar nicht!
Ich würde gern das Datum, das ich für die URLs erzeuge, auch im Dateinamen haben, wie kann ich das machen?
Bestens
Thomas*
PS: Bin ja schon froh, mich bis hier "durchgebissen" zu haben...
echo $begrüßung;
- Ich verstehe nicht, warum ich Summe(); brauche für echo $b; ?
Summe() hat die Aufgabe den Inhalt der Variable $b zu ändern. Du brauchst Summe() nicht, um $b auszugeben. Dieses Beispiel soll zeigen, wie man innerhalb von Funktionen auf global deklarierte Variablen zugreift und deren Inhalt verändert ($b) oder ausliest ($a und $b).
(Im Allgemeinen ist dies schlechter Programmierstil, da solche Funktionen nicht universell verwendbar sind. Besser wäre es, wenn Summe() zwei Parameter verlangte und das Berechnungsergebnis als Funktionsergebnis zurückgäbe. Doch das nur nebenbei.)
- Und warum hab ich $URLs außerhalb der for-Schleife auch ohne global?
Jede Funktion hat ihren eigenen Namensraum. Andere Blöcke, wie sie für if, for, while, etc. verwendet werden, haben keinen extra Namensraum.
- Wie krieg ich $i1 aus der for-Schleife raus, in meinen Dateinamen?
[code lang=php]
$i1=0;
for($i1=20060101; $i1<=20060131; $i1++)
{ global $i1;
$URLs[] = "http://.com/statistics/online.html?busdate=".($i1)."type=C&expiry=200603";
}
Am Ende dieser Schleife steht $i1 auf 20060132 und bleibt so, bis jemand im weiteren Verlauf des Scripts diesen Wert ändert.
$filename = "C_stats_from"."$i1";
Ich würde gern das Datum, das ich für die URLs erzeuge, auch im Dateinamen haben, wie kann ich das machen?
Welcher der Werte, die $i1 im Laufe der for-Schleife zugewiesen wurde, soll es denn sein?
echo "$verabschiedung $name";
Hallo $name;
Summe() hat die Aufgabe den Inhalt der Variable $b zu ändern. Du brauchst Summe() nicht, um $b auszugeben.
Ich widerspreche dir mal mit einem Bild und fokusiere nochmal auf das Bsp. vom PHP Handbuch.
Ich hab das Beispiel 12-1: http://www.php.net/manual/de/language.variables.scope.php erweitert.
Wenn ich //Summe2(); auskommentiere bekomme ich bei $c nicht 7. Wie bekomme ich 7 OHNE Summe2()?:
Servus
Thomas*
echo $begrüßung;
Summe() hat die Aufgabe den Inhalt der Variable $b zu ändern. Du brauchst Summe() nicht, um $b auszugeben.
Ich widerspreche dir mal mit einem Bild und fokusiere nochmal auf das Bsp. vom PHP Handbuch.
Deine Frage lautete
Ich verstehe nicht, warum ich Summe(); brauche für echo $b; ?
echo $b; gibt den Wert von $b aus. Summe() wird für diese Ausgabe nicht benötigt. Summe() wird benötigt, um den Wert von $b vorher zu berechnen. Das ist ein Unterschied. Du wirst ihn möglicherweise krümelkackerisch finden, aber das stört mich nicht. Programmieren ist für mich eine Tätigkeit bei der es auf Exaktheit ankommt.
Ich hab das Beispiel 12-1: http://www.php.net/manual/de/language.variables.scope.php erweitert.
Es wäre besser gewesen, wenn du den Code per Copy&Paste hier als Text eingefügt hättest. Teile einer Grafik lassen sich so schwer zitieren.
Du verschachtelst Funktionsdeklarationen. Dies ist unter PHP nicht sinnvoll, da Funktionen immer global abgelegt werden. Außerdem erfolgt die Deklaration von Summe2() erst, wenn Summe() ausgeführt wird. Dies wird dann aber jedes Mal versucht. Somit muss Summe() einmal aufgerufen worden sein, bevor Summe2() benutzt werden kann. Du kannst aber Summe() kein zweites Mal aufrufen, ohne dass dein Script mit einem Fatal Error abgebrochen wird, weil Summe2() bereits existiert.
Wie ich auch bereits sagte, ist es besser, wenn eine Funktion Parameter entgegennimmt und daraus ein Ergebnis berechnet anstatt Variablen aus anderen Geltungsbereichen zu verändern.
function Summe($summand1, $summand2) {
return $summand1 + $summand2;
}
Aufrufen kann man diese Funktion dann so:
echo Summe(1, 1);
$a = 1;
$b = 2;
$c = Summe($a, $b);
echo $c;
usw.usf.
Wenn ich //Summe2(); auskommentiere bekomme ich bei $c nicht 7. Wie bekomme ich 7 OHNE Summe2()?:
Auf viele Arten. Meist ist ja nicht das Ergebnis bekannt sondern die Eingangsparameter. Wie also lauten deine Eingangsparameter, bzw. wie lautet die Aufgabenstellung?
echo "$verabschiedung $name";
$begrüßung-krümelkackerisch;
echo $b; gibt den Wert von $b aus. Summe() wird für diese Ausgabe nicht benötigt. Summe() wird benötigt, um den Wert von $b vorher zu berechnen. Das ist ein Unterschied. Du wirst ihn möglicherweise krümelkackerisch finden, aber das stört mich nicht.
;-) Ich find und fand gar nichts "krümelkackerisch", bin doch froh dass mir geholfen wird!
Ich hab das Beispiel 12-1: http://www.php.net/manual/de/language.variables.scope.php erweitert.
Es wäre besser gewesen, wenn du den Code per Copy&Paste hier als Text eingefügt hättest.
<?php
$a = 1;
$b = 2;
$c = 4;
function Summe()
{
global $a, $b;
$b = $a + $b; // $b ist 3
function Summe2()
{
global $a, $b, $c;
$c = $b + $c; // $c 7
}
}
Summe();
echo "$b <-- soll 3 sein <br>";
//Summe2();
echo "$c <-- soll 7 sein";
?>
Du verschachtelst Funktionsdeklarationen. Dies ist unter PHP nicht sinnvoll, da Funktionen immer global abgelegt werden. Außerdem erfolgt die Deklaration von Summe2() erst, wenn Summe() ausgeführt wird. Dies wird dann aber jedes Mal versucht. Somit muss Summe() einmal aufgerufen worden sein, bevor Summe2() benutzt werden kann.
Hab ich voller Verwunderung auch schon festgestell, als ich Summe(); auskommentiert hatte.
Du kannst aber Summe() kein zweites Mal aufrufen, ohne dass dein Script mit einem Fatal Error abgebrochen wird, weil Summe2() bereits existiert.
Hilfe, dass ist für mich bis jetzt noch eignetlich gar nicht zu verstehen...
Wie ich auch bereits sagte, ist es besser, wenn eine Funktion Parameter entgegennimmt und daraus ein Ergebnis berechnet anstatt Variablen aus anderen Geltungsbereichen zu verändern.
Ich hab das sinnlose Bsp. nur gemacht um mit dem "Geltungsbereich von Variablen" etwas vertraut zu werden, dabei bin ich wohl dummerweise ziemlich ins function-Fettnäpfchen getreten! War nicht meine Absicht... Das Bsp. aus dem PHP-manual hat mir aber irgendwie keine Vorstellung des "Geltungsbereichs" gegeben. Für mich waren die () der Funktion identisch mit den () von for. Üble Täuschung von mir!
... wie lautet die Aufgabenstellung?
Es ging nicht um Funktionen, sondern um eine Bildung einer Vorstellung, wie ich Variablen uneingeschränkt über mein ganzes Script verwenden kann. Ich als eine Art PHP-Dau, hab mich durch die Einschränkung, die da plötzlich auf mich zu kam sehr unwohl gefühlt.
Aber das war dann wohl auch noch eine Täuschung weil ich in meinem Script eigentlich gar keine Funktion habe, sonder nur ein zwei "for und ein zwei "if". Damit sei aber gar keine Einschränkung mit dem "Geltungsbereich von Variablen" da wurde hier gesagt.
Somit schein das Problem ein anderes zu sein... Mir summt jetzt aber nur noch die Birne (hab inzwischen eigentlich das Problem durch hin und herschieben von Code "gelöst") aber nun tritt an anderer Stelle eine Ungereimtheit auf...
Ich muß neu daran gehen um ein Problem zu formulieren.
Merci
Thomas*
echo $begrüßung;
Du kannst aber Summe() kein zweites Mal aufrufen, ohne dass dein Script mit einem Fatal Error abgebrochen wird, weil Summe2() bereits existiert.
Hilfe, dass ist für mich bis jetzt noch eignetlich gar nicht zu verstehen...
Es gibt unter PHP eine Menge Funktionen. Deren Name muss eindeutig sein. Es gibt kann keine zwei Funktionen mit dem gleichen Namen geben. Und es gibt PHP-intern nur eine globale Liste, die die Funktionsnamen enthält (Das mag zwar nicht ganz richtig sein, jedoch kann man sich das zumindest einmal so vorstellen.) Stößt PHP auf eine Funktionsdeklaration versucht es, diese neue Funktion in der Liste aufzunehmen. Wenn es bereits eine Funktion mit dem gleichen Namen gibt, gibt es einen Fatal Error und das Script bricht ab. Dummerweise trifft PHP jedes Mal beim Ausführen von Summe() auf die Deklaration von Summe2() und versucht diese Funktion neu aufzunehmen ...
Es ging nicht um Funktionen, sondern um eine Bildung einer Vorstellung, wie ich Variablen uneingeschränkt über mein ganzes Script verwenden kann.
Solange du keine Funktionen deklarierst sind alle Variablen über das gaze Script verteilt für jeden sichtbar. {}-Paare bilden keinen eigenen Variablen-Scope. Nur Funktionen tuen dies.
Versuche keine Monsterscripte zu erstellen. Es mag für dich am Anfang so aussehen, dass es übersichtlicher ist, wenn alle Variablen überall erreichbar sind und über das gesamte Script hinweg verwendet werden können, doch dieser Eindruck täuscht. Versuche zu erkennen, wo ein Programmteil eine abgeschlossene Aufgabe erfüllt und lagere dieses in eine Funktion aus.
echo "$verabschiedung $name";
Gute Nacht!
Versuche zu erkennen, wo ein Programmteil eine abgeschlossene Aufgabe erfüllt und lagere dieses in eine Funktion aus.
Ja, dass mach ich! Und das Gesagte von heute schön überdenken, hab doch eineiges gelernt. Jetzt aber sleepy...
Vielen Dank
Thomas*
Hallo,
<?php
$a = 1;
$b = 2;
// hier wird eine Funktion im Steuerfluß definiert
function Summe()
{
global $a, $b;$b = $a + $b;
}
// hier wird die gerade definierte Funtion erst aus geführt
Summe();
echo $b; // gibt 3 aus
?>
> 2. Wie krieg ich $i1 aus der for-Schleife raus, in meinen Dateinamen?
> 3. Und warum hab ich $URLs außerhalb der for-Schleife auch ohne global?
> ~~~php
> $i1=0;
> for($i1=20060101; $i1<=20060131; $i1++)
// global ist ein Sprachkonstrukt, das innerhalb von Funktionen
// dafür sorgt, das Varablen des globalen Geltungsbereich in den
// Geltungsbereich von Funktionen "improtiert" werden
// for(){} ist nur ein einfacher Anweisungsblock und bedient sich
// des globalen Geltungsbereichs automatisch
// somit ist gglobal hier falsch notiert und muß raus
> { global $i1;
// hierbei wird dann z. B. http://.com/statistics/online.html?busdate=20060101type=C&expiry=200603
// ausgegeben es soll aber sicher
// http://.com/statistics/online.html?busdate=20060101&type=C&expiry=200603
// heißen...
> $URLs[] = "http://.com/statistics/online.html?busdate=".($i1)."type=C&expiry=200603";
> }
>
> // usw. usw.
> if($snoopy->fetch("$URLs[$i2]"))
> {
> echo "response code:<br> ".$snoopy->response_code."<br>\n";
> while(list($key,$val) = each($snoopy->headers))
> echo $key.": ".$val."<br>\n";
> $headers = $snoopy->headers;
> }
> // usw. usw.
>
> $HTML5 = $snoopy->results;
>
> // Dateien erzeugen
> $filename = "C_stats_from"."$i1";
> $filename .= date("Ymd-His"); // erzeugt dateinamen mit datum und uhrzeit
> $Datei = "$filename.htm";
> $FilePointer = fopen($Datei, "w");
> fwrite($FilePointer, $HTML5);
> fclose($FilePointer);
>
Ich würde Dir nahelegen ersteinmal etwas leichtere Kost zu programmieren, also nicht sofort objektorientiert zu arbeiten.
Gruß aus Berlin!
eddi
Hallo,
<?php
$a = 1;
$b = 2;
// hier wird eine Funktion im Steuerfluß definiert
was ist ein Steuerfuß [link:http://de.wikipedia.org/wiki/Spezial:Search?search=Steuerflu%C3%9F&go=Artikel]
function Summe()
{
global $a, $b;$b = $a + $b;
}
// hier wird die gerade definierte Funktion erst ausgeführt
Summe();
echo $b; // gibt 3 aus
?>
Ja, dass erklärt mir einiges!
Das Bsp. von dir mit den zwei Links hab nicht verstanden:
http://.com/statistics/online.html?busdate=20060101&type=C&expiry=200603
http://.com/statistics/online.html?busdate=20060101type=C&expiry=200603
^ da fehlt das &
> > Ich würde Dir nahelegen ersteinmal etwas leichtere Kost zu programmieren, also nicht sofort objektorientiert zu arbeiten.
Da hast du nicht unrecht, aber man kann ja unabhängig Fragen der "globalität" besprechen. Es funktioniert ja soweit alles ganz gut und ich bin quasi fast fertig, ist nur für mich privat der Code.
Die Sites werde wunderbar aufgerufen und auch in Dateien abgespeichert. NUR diesen Zusatz aus $i1 will ich noch in $filename anknüpfen.
~~~php
for($i1=20060101; $i1<=20060131; $i1++)
{
$URLs[] = "http://.com/statistics/online.html?busdate=".($i1)."type=C&expiry=200603";
}
// usw. usw.
$HTML5 = $snoopy->results;
// Dateien erzeugen
$filename = "C_stats_from"."$i1"; // <----???
$filename .= date("Ymd-His"); // erzeugt dateinamen mit datum und uhrzeit
$Datei = "$filename.htm";
$FilePointer = fopen($Datei, "w");
fwrite($FilePointer, $HTML5);
fclose($FilePointer);
Muß man da immer mit for-schleife arbeiten?
Ich find das Ausgeben von arrays ziemlich umständlich, wie sieht das denn in anderen Sprachen aus, ist das immer so? Brauch immer extra eine for-schleife?
// Ausgeben von Array
for($i=0; $i<31; $i++)
{ global $i1;
echo "<pre>$URLs[$i]</pre>";
}
Hallo,
was ist ein Steuerfluß
die Abarbeitung eines Programmes/Scripts
$URLs[] = "http://.com/statistics/online.html?busdate=".($i1)."type=C&expiry=200603";
Das Bsp. von dir mit den zwei Links hab nicht verstanden:
http://.com/statistics/online.html?busdate=20060101&type=C&expiry=200603
http://.com/statistics/online.html?busdate=20060101type=C&expiry=200603
^ da fehlt das &
Vermutlich ist Dir dort ein Fehler unterlaufen. Die letze der beiden Zeilen ist Das Ergebnis aus der oben notierten Zeile Deines Quellcodes.
Muß man da immer mit for-schleife arbeiten?
Nur wenn mehrere Arbeiten gleicher Art ausgeführt werden sollen (wo unter umständen auch auf die (An)Zahl der einzelnen Durchläufe zurückgegriffen werden muß).
Ich find das Ausgeben von arrays ziemlich umständlich, wie sieht das denn in anderen Sprachen aus, ist das immer so? Brauch immer extra eine for-schleife?
Mit PHP bist Du da schon relaiv gut bedient. Andere Sprachen haben keine andere Möglichkeit, wie beispielsweise die folgende:
echo '<pre>'.implode("\n",$URLs).'</pre>';
http://de3.php.net/manual/de/function.implode.php
Gruß aus Berlin!
eddi