PHP Notizen vermeiden oder tollerieren

lordg2009

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.503
Hi,

in Zeiten wo ich mit Perl experimentierte nutzte ich gern den strict mode und deklarierte Variablen zu Skriptbeginn, um sie später zu initialisieren.

In PHP bekommt man mit dem Code Schnipsel

PHP:
if($_GET['text'] == 'Hallo')

eine Notice, wenn der Array mit dem Index noch nicht existiert.
Abhilfe kann man sich schaffen mit

PHP:
if(isset($_GET['text']) && $_GET['text'] == 'Hallo')

Ist das nun aber sinnvoll?
PHP zeichnet sich doch gerade durch eine schwache Typisierung und den einfacheren Umgang mit Variablen aus.
Wenn man nun diese ganzen Notice's behebt, könnte man doch gleich eine Programmiersprache mit stärkerer Typisierung wählen und sich die Nachteile, die die schwache Typisierung mit sich bringt sparen, oder?

Vielen Dank für eure Hilfe

PS: Mir ist bewusst, dass man die Fehlerausgabe letztendlich sowieso abschaltet, aber die Notice's werden ja irgendeinen Sinn haben.
 
Hi,

naja, "schwache Typisierung" hat ja nichts mit "automatisch schlampig programmieren" zu tun! Ein Array zu nutzen ohne es deklarativ zu erzeugen oder ein Feld in dem Array auf einen Wert zu prüfen, ohne zu testen, ob es das Feld überhaupt gibt fällt für mich in die letztere Kategorie. Das hat nichts mit schwacher Typisierung zu tun.

Fällt für mich klar in die Rubrik: Kann man so machen, sollte man aber nicht. Und das gilt generell: nur weil man etwas kann muss man es nicht zwingend auch umsetzen :)

VG,
Mad
 
Speziell in diesem Beispiel, würdest du das isset() mit reinnehmen?
Ich laß glaube ich, dass php ein nicht deklarierten Array wie einen leeren Array behandelt. Ist es schlampig, wie im ersten Beispiel zu programmieren, wenn genau das mein gewünschter Effekt ist?
 
Die schwache Typisierung greift eher, wenn eine Funktion als Parameter wahlweise n String oder n Array haben kann, oder wenn diese Funktion in Abhängigkeit der Parameter eben NULL, FALSE, "", n String, n Array oder n Objekt zurück gibt.

Das, was du da machst, ist eben schlichtweg irgendwo zwischen unsauber und schlichtweg falsch.

Nachtrag: Isset() gehört drumrum. Würdest du if($_GET['name'] && $_GET['name']=="Hallo") schreiben, dann würde auch das ne Notice ausspucken.
 
PHP:
    if(isset($_GET['text']) && $_GET['text'] == 'Hallo')

Du weißt schon, dass $_GET für eine Variablenübergabe genutzt wird. z.B. http://www.lol.de/index.php?text=Hallo

PHP:
if(isset($_GET['text'])
{
$variable=$_GET['text'];
}

In der Variablen $variable steht dann Hallo.

Alternativ könnte man auf $_Session zurückgreifen.
Dann sollte es auch zu keinem Hinweis kommen.

P.S.
Wenn mal keine Variable übergeben wird und du prüfst nicht mit isset,
dann wirst du eine Fehlermeldung bekommen.
 
@Suxxess
Es macht durchaus Sinn, direkt Vergleiche auf $_POST/GET/REQUEST zu machen. Wozu noch zusätzlich in eine Variable packen, wenn man nur wissen will, ob ein bestimmter Status gesetzt ist?

Denk doch nur an if($_GET['isAjax']){}...
 
Eine Zuweisung auf ein nicht definiertes Feld würde keine Notice auslösen. Bin mir außerdem nicht ganz sicher, aber ich glaube, man kann POST/GET/REQUEST auch schreibend bearbeiten. Macht zwar wenig Sinn, aber nun ja. Es geht.
 
Ist das so, dass ein isset drumherum zwingend notwendig ist?

Ich dachte eigentlich, dass PHP wie andere Sprachen (z.B. Java) if-Statements intelligent prüft.

PHP:
if(isset($_GET['text']) && $_GET['text'] == 'Hallo')

Ich hätte in dem Beispiel jetzt vermutet, dass PHP da ebenfalls den AND-Operator erkennt und die Überprüfung von $_GET['text'] == 'Hallo' gar nicht mehr durchführt, weil bei der Auswertung vom ersten Teil ( isset($_GET['text']) ) auf false dann direkt abgebrochen wird.

Ist das in PHP also tatsächlich nicht der Fall?
 
Natürlich führt PHP intelligente Prüfungen durch und bricht vorzeitig ab. DAs ändert aber nichts an der Notwendigkeit, auf isset() zurück zu greifen.

Nehmen wir dein Beispiel mal auseinander...

isset($_GET['text') --> Ist die GET-Variable "text" überhaupt gesetzt oder allgemeiner: hat der Array einen Key "text"? Wenn nein -> If-Bedinungung wird nie wahr, versuch gar nicht erst auf $_GET['text'] für den 2. Teil zuzugreifen. Logische Folge: Wenn es den Key "text" nicht gibt, dann löst diese Abfrage 1.) ein false aus und 2.) eben KEINE Notice für n unsinnigen Array-Zugriff.
 
@Daaron: Genau, exakt, darauf wollte ich auch hinaus...dass das verschachtelte isset nicht unbedingt nötig wäre und der zweite Vorschlag des TE's doch in Ordnung sein sollte:

PHP:
if(isset($_GET['text']) && $_GET['text'] == 'Hallo')

Ich hab nämlich nicht ganz verstanden, warum man dass unbedingt ändern wollte in ein isset "drumherum".
Schachtelungen find ich schwerer zu lesen und macht den Code meines Erachtens nach weniger gut wartbar, deshalb wäre meine Empfehlung immer, mit möglichst wenigen Schachtelungen in if-Statements auszukommen.
 
Der TE wollt aber auch wissen, ob diese "2-in-1"-Notation sinnig ist, weil er irgendwie die Sache mit der schwachen Typisierung falsch verstanden hat. Und in diesem Sinne: Jep, ist nicht nur sinnig, sondern für sauberen Code auch notwendig.

Ob man jetzt, wie Suxxess, schachtelt, oder ob man lieber die kompakte Notation wählt, das hängt vom eigenen Geschmack und der Aufgabenstellung ab.
Stell dir mal vor, du hättest if($arr['key']==1){} elseif $arr['key'] ==2 {}...). Hier sparst du viel Platz und Rechenleistung, wenn du vorher einfach mal mit dem Holzhammer guckst, ob "key" überhaupt existiert.
 
Jup, in der Tat, dann war das nur "aneinandervorbeigerede" :)
 
Zurück
Oben