Original von adrian90
Ja OK aber die Schleifen und If-Abfragen werden ja nicht gleich geahndet wie einen Anweisungsblock.
Ein Anweisungsblock ist einfach dass, was zwischen den geschweiften Klammern steht... (oder bei Pascal/Delphi eben zwischen BEGIN und END)
und bei
PHP:
if($foo=="bar")
{
//do something
}
ist das, wo "//do something" drin steht demzufolge ein Anweisungsblock.
Original von adrian90
Ist es nicht so, dass die Variablen von ausserhalb auch in den Schleifen und If-Abfragen benützbar sind?
Klar; Variablen, die in einem übergeordneten Anweisungsblock deklariert wurden, sind in einem untergeordneten Anweisungsblock natürlich noch verfügbar. ABER NICHT UMGEDREHT! (außer bei PHP)
Original von adrian90
Wer definiert denn schon eine Variable innerhalb einer If-Abfrage.
Dies ist wohl fast nie der Fall.
Ich geh mal davon aus, dass du wahrscheinlich noch nicht sooo lang programmierst und noch keine größeren Projekte hattest, wo es auch auf Speicher-Optimierung und Sicherheit ankommt...
Variablen sollten stets so global wie nötig, aber so lokal wie möglich deklariert werden
Damit können sie nicht in einem Programm-Teil, in dem sie überflüssig sind, fälschlicherweise (oder auch böswilligerweise) manipuliert werden (oder wie im folgenden Beispiel andere Werte überschreiben) und außerdem belegen sie nur solange Arbeitsspeicher, wie sie wirklich benötigt werden.
kleines C++-Beispiel:
einmal den Ort der Deklaration nicht beachtet:
Code:
int i=5;
//Die Variable i ist 5 und wird auch noch später so benötigt
/* [jede Menge Code] */
//und irgendwo eine Zählschleife
for(i=0;i<=9;i++)
{
// do something
}
/* [noch etwas Code] */
//und hier wird die alte Variable i benötigt
cout << "i hat den Wert " << i << endl;
// OH SCHRECK, i IST NICHT MEHR 5 SONDERN 10!!!!!
und einmal nach dem Leitsatz "so lokal wie möglich":
Code:
int i=5;
//Die Variable i ist 5 und wird auch noch später so benötigt
/* [jede Menge Code] */
//und irgendwo eine Zählschleife
for(int i=0;i<=9;i++)// hier wird i nochmal lokal deklariert und hat nichts mehr mit der oben deklarierten Variable i zu tun. Dieses i ist nur innerhalb der for-Schleife verfügbar...
{
// do something
}
/* [noch etwas Code] */
//und hier wird die alte Variable i benötigt
cout << "i hat den Wert " << i << endl;
// und i ist noch immer 5, so wie gewünscht!
Ich finde PHP eine schöne Sprache, auch wenn die Einwände von System.I/O nicht ganz von der Hand zu weisen sind.
- wobei ich bei dem, was ich mit PHP so mache, nicht wüsste, wozu ich in einer Scriptsprache unbedingt Threads brauchen sollte...
- schlechte Namensgebung wüsste ich jetzt auch nicht, wo ich die finden sollte
- und die Tatsache, dass Variablen automatisch gecastet werden, finde ich auch nicht sooo schlimm (man kann ja z.B. mit is_int(), is_string(), is_array() etc. den Typ abfragen, um vor unerwünschter Eingabe zu schützen...)