Skip to content

Commit 1dc61fd

Browse files
committed
Allgemein: Headings im Text ein Level hochgezogen.
Die erste Überschrift im Fließtext/Guide ist nun h2 (war h3). Usw. Die automatische Hauptüberschrift steht inzwischen in h1, sodass nun eine korrekte Abfolge der Heading-Elemente erreicht ist.
1 parent 698e83c commit 1dc61fd

63 files changed

Lines changed: 522 additions & 522 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

code-optimizing/02_code-smells.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ Dieser Artikel richtet sich an Spracheinsteiger, Fortgeschrittene können [bei W
4343

4444
<div class="alert alert-info"><strong>Achtung!</strong> Der Artikel nutzt reduzierte Lehrbeispiele. Der Übersichtlichkeit halber können wichtige Funktionen zur Eingabevalidierung o. ä. weggelassen worden sein.</div>
4545

46-
### [Leere Strings](#emtpy-strings)
46+
## [Leere Strings](#emtpy-strings)
4747
{: #emtpy-strings}
4848

4949

50-
#### [Problem](#problem-1)
50+
### [Problem](#problem-1)
5151
{: #problem-1}
5252

5353
Code-Smells mit leeren Strings
@@ -63,7 +63,7 @@ $myString = '' . $myInt;
6363
~~~
6464

6565

66-
#### [Ersatz](#ersatz-1)
66+
### [Ersatz](#ersatz-1)
6767
{: #ersatz-1}
6868

6969
Leere Strings sind ausnahmslos zu streichen.
@@ -81,7 +81,7 @@ Wenn es darum geht, andere Typen nach String zu casten, sollte explizites Typ-Ca
8181
$myString = (string)$myInt;
8282
~~~
8383

84-
### [Unnötiges Variablen-Parsing in Doppelquotes](#useless-doubleqoutes)
84+
## [Unnötiges Variablen-Parsing in Doppelquotes](#useless-doubleqoutes)
8585
{: #useless-doubleqoutes}
8686

8787
PHP unterstützt die Verwendung von Variablen innnerhalb von doppelten Anführungszeichen. Dort befindliche Variablen werden in Ihren Wert aufgelöst:
@@ -92,7 +92,7 @@ echo "Mein Hut der hat $foo Ecken";
9292
~~~
9393

9494

95-
#### [Problem](#problem-2)
95+
### [Problem](#problem-2)
9696
{: #problem-2}
9797

9898
Code-Smells mit unnützen Stringsquotes
@@ -112,7 +112,7 @@ var_dump($stringvar); //(string) 17
112112
Die Stringbegrenzer erfüllen hier keinen Zweck - sie umschließen kein weiteres Zeichen außer dem Variableninhalt. Im Gegenteil veranlassen sie PHP zu unnötiger Arbeit, dem Einbetten einer Variable in einen String, der dann wiederum geparst wird.
113113

114114

115-
#### [Ersatz](#ersatz-2)
115+
### [Ersatz](#ersatz-2)
116116
{: #ersatz-2}
117117

118118
Solche Konstrukte sind gegen die alleinstehende Variable auszutauschen.
@@ -128,11 +128,11 @@ $stringvar = (string)$myInt;
128128
Wenn es darum geht, andere Typen nach String zu casten, sollte explizites Typ-Casting verwendet werden (siehe oben).
129129

130130

131-
### [SELECT *](#select-all)
131+
## [SELECT *](#select-all)
132132
{: #select-all}
133133

134134

135-
#### [Problem](#problem-3)
135+
### [Problem](#problem-3)
136136
{: #problem-3}
137137

138138
Code-Smells mit *-Select
@@ -144,7 +144,7 @@ $query = "SELECT * FROM Personen";
144144
Aus der Datenbanktabelle wird hier stets jedes Feld der Zeile abgefragt. Oft ist das gar nicht nötig, weil nur ein Teil der Felder verarbeitet wird. Zudem sagt das Statement nichts darüber aus, welche Werte es liefert. Kritisch wird es, wenn sich die Tabellenstruktur ändert - Folgefehler (Zugriff auf nicht mehr existente Feldnamen) oder das Auslesen von unnützen Daten (Text, Blob) kann die Folge der *-Konvention sein.
145145

146146

147-
#### [Ersatz](#ersatz-3)
147+
### [Ersatz](#ersatz-3)
148148
{: #ersatz-3}
149149

150150
Es sind immer die Namen der Felder anzugeben. In Hinsicht auf Keyword-Probleme ist es sinnvoll, dabei Backticks zu verwenden.
@@ -158,11 +158,11 @@ $query = "SELECT `Id` , `Name` , `E-Mail` FROM Personen";
158158
Übrigens existiert dieses Problem auch vertikal: Wer sich sicher ist, dass eine Zeile mit einer bestimmten WHERE-Bedingung nur einmal vorkommen kann, hat sicher kein Problem damit, ein LIMIT 1 zu ergänzen.
159159

160160

161-
### [LIMIT vs. PHP-Counting](#limit-vs-php-counting)
161+
## [LIMIT vs. PHP-Counting](#limit-vs-php-counting)
162162
{: #limit-vs-php-counting}
163163

164164

165-
#### [Problem](#problem-4)
165+
### [Problem](#problem-4)
166166
{: #problem-4}
167167

168168
Code-Smells mit Limit
@@ -185,7 +185,7 @@ while ($data = mysqli_fetch_assoc($ress)) {
185185
Hier bricht PHP nach 3 Ausgaben das Auslesen der Datenbank ab. Diese hat allerdings im Vorfeld alle Personendatensätze zusammengestellt, und seien es 50000.
186186

187187

188-
#### [Ersatz](#ersatz-4)
188+
### [Ersatz](#ersatz-4)
189189
{: #ersatz-4}
190190

191191
Wo immer möglich ist ein LIMIT für die Querymenge anzugeben. Die Datenbank kann dann die Anfrage entsprechend optimieren, liefert auch immer gleich die passende Menge und erspart damit auch PHP-seitige Handstände.
@@ -202,11 +202,11 @@ while ($data = mysqli_fetch_assoc($ress)) {
202202
}
203203
~~~
204204

205-
### [LIMIT und Schleife](#limit-vs-loop)
205+
## [LIMIT und Schleife](#limit-vs-loop)
206206
{: #limit-vs-loop}
207207

208208

209-
#### [Problem](#problem-5)
209+
### [Problem](#problem-5)
210210
{: #problem-5}
211211

212212
Code-Smells mit auslesenden Schleifen
@@ -238,7 +238,7 @@ if (!$auth) {
238238
Sowohl LIMIT 1, als auch eine sinnvolle Scriptlogik - in einem Loginprozess sollte es nur einen, datenbankweit eindeutigen Nutzernamen geben können (Primärschlüssel) - begrenzen hier die maximale Menge an Datensätzen auf 1. while (.. fetch()) ist dagegen ein Codefragment, um alle Datensätze einer Anfrage auszulesen.
239239

240240

241-
#### [Ersatz](#ersatz-5)
241+
### [Ersatz](#ersatz-5)
242242
{: #ersatz-5}
243243

244244
Die meisten Nutzer wissen gar nicht, was das while hier überhaupt tut. Kurz gesagt werden hier per Schleife solange Datensätze von der Datenbank angefordert, bis die Datenbank FALSE für "keine weiteren Datensätze" zurückliefert. Die Schleife läuft dadurch, dass diese Rückgabe die Schleifenbedingung bildet.

code-optimizing/04_eva-prinzip.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ Das **EVA-Prinzip** (Eingabe - Verarbeitung - Ausgabe) steht für ein Paradigma,
5656
linear in dieser Reihenfolge erfolgen sollen. Dies ist technisch sinnvoll, soll aber auch eine Abbildbarkeit eines Softwareprozesses auf eine abstraktes Prinzip unterstützen, das dem Prinzip *Ursache* und *Wirkung* nahekommt.
5757

5858

59-
### [Einleitung](#einleitung)
59+
## [Einleitung](#einleitung)
6060
{: #einleitung}
6161

6262
Die Sprache PHP ist eng mit dem EVA-Prinzip verknüpft, weil der übliche Spracheinstieg eng mit der Funktion von PHP als dynamische Ausgabe verknüpft ist:
@@ -106,7 +106,7 @@ Im Prinzip haben wir jetzt alle Komponenten zusammen. Die Eingabe (hier durch di
106106
Im Beispiel wirkt PHP größtenteil als Templating-Funktion. Das bedeutet, in ein statisches (Text-)Konstrukt (Template) wird ein dynamischer Inhalt „eingebaut“. Im Prinzip ist das auch die Hauptaufgabe von PHP - die Sprache wurde entworfen, um dynamisch HTML-Dokumente zu generieren. PHP ist jedoch auch eine vollwertige Programmiersprache. Wir könnten also innerhalb unseres Dokuments Werte berechnen, Dateisystemoperationen durchführen o.ä. In diesem Fall wird unser Template schnell fragmentiert, da die Anzahl von Codezeilen der Verarbeitungs-Komponente stark zunimmt. Auch stellt sich die Frage, an welche Stelle diese Verarbeitung gehört. Praktisch gesehen natürlich vor die Ausgabe (das ist logisch), das EVA-Prinzip geht allerdings weiter und definiert den richtigen Platz dafür vor jegliche Ausgabe.
107107

108108

109-
### [EVA und das Client-Server-Prinzip](#client-server-prinzip)
109+
## [EVA und das Client-Server-Prinzip](#client-server-prinzip)
110110
{: #client-server-prinzip}
111111

112112
Um dies weiter zu betrachten, müssen wir uns kurz das Prinzip von Webkommunikation ansehen. Auf einen Request des Client erfolgt die Antwort in Form unseres PHP-generierten Dokuments. Auf einer tieferen Ebene (vgl. OSI-Modell) wird neben den offensichtlichen Textinhalten aber auch eine Reihe von Meta-Informationen versendet: die sogenannten HTTP-Header. Diese Header können auch durch PHP gesetzt werden. Nicht gesetzte Header produziert der Webserver eigenständig. Für das EVA-Prinzip relevant ist vor allem, dass dies vor jeglicher Textausgabe erfolgt. Das bedeutet, der Webserver erkennt eine Textausgabe und verschickt die HTTP-Header des Dokuments, bevor er die Ausgabe ausliefert.
@@ -148,7 +148,7 @@ Der HTML-Inhalt wird zu einem reinen Ausgabetext von PHP, der erst im Browser se
148148
Gehen wir zurück zur obigen AUssage zu Headern, werden die Header ziemlich genau in dem Moment „abgesendet“, in dem der PHP-Parser `echo` druchläuft.
149149

150150

151-
### [Bedeutung](#bedeutung)
151+
## [Bedeutung](#bedeutung)
152152
{: #bedeutung}
153153

154154
Solange wir PHP in seiner Grundfunktion als Ausgabesprache nutzen, brauchen wir uns im Prinzip keine Sorgen um EVA und die HTTP-Header machen. Sobald wir etwas tiefer einsteigen, wird das schnell unabdingbar. Viele wichtige Mechanismen basieren auf dem Prinzip von HTTP-Headern:
@@ -163,7 +163,7 @@ Solange wir PHP in seiner Grundfunktion als Ausgabesprache nutzen, brauchen wir
163163
All diese Funktionen müssen vor jeglichen Textausgaben des Dokuments geschehen, sonst resultieren sie in einem [headers-sent-Fehler]({{ page.root }}/jumpto/headers-already-sent/).
164164

165165

166-
### [Umsetzung](#umsetzung)
166+
## [Umsetzung](#umsetzung)
167167
{: #umsetzung}
168168

169169
Der klassische Einsteigerfehler ist, die Anwendung nach dem Funktionsprinzip und nicht nach EVA zu gliedern:
@@ -214,7 +214,7 @@ echo $out;
214214
Die Prüfung ist nicht direkt für die Ausgabe verantwortlich und kann deshalb früher erfolgen. Die Ausgabe ist sowieso nur für den Fehlerfall relevant, im Erfolgsfall wird ja gleich weitergeleitet.
215215

216216

217-
#### [Funktionsrückgabe](#funktionsrueckgabe)
217+
### [Funktionsrückgabe](#funktionsrueckgabe)
218218
{: #funktionsrueckgabe}
219219

220220
Die meisten der obigen Aussagen, lassen sich auf Funktionen übertragen. Meist dienen Funktionen ja dazu, wiederverwendbare oder zusammengehörige Funktionalität zu kapseln. Damit können Sie ein Paradebesipiel für EVA sein: Sie erhalten nötige Eingabewerte, stellen irgendetwas damit an und geben das fertige Produkt zurück. Leider sieht die Realität sehr oft immer noch so aus:
@@ -254,7 +254,7 @@ echo 'Der Pythagoras lautet: ' , doPythagorean(17 , 4);
254254
Die Funktion stellt sozusagen den Schritt „Verarbeitung“ dar, Ihre Schnittstellen die Schritte Eingabe (Liste der Parameter) und Ausgabe (Return-Wert).
255255

256256

257-
#### [Methodenrückgabe](#methodenrueckgabe)
257+
### [Methodenrückgabe](#methodenrueckgabe)
258258
{: #methodenrueckgabe}
259259

260260
Auch in der objektorientierten Programmierung (OOP) läßt sich vortefflich schludern. Für Eingaben, vor allem die Instanziierung von Objekten, spiegelt sich EVA im Pattern der sog. Dependency Injection wieder, wir wollen aber zunächst die Methodenrückgabe betrachten.
@@ -303,7 +303,7 @@ if (true === $user->checkAge($_POST['age'])) {
303303
<div class="alert alert-info"><strong>Information!</strong> Die vorliegenden Codes sind Lehrbeispiele und der Übersichtlichkeit halber stark vereinfacht. Der Sinn, einen User ggf. ohne Altersangabe und ohne Validierung des Namens zu erstellen, ist natürlich in Frage zu stellen.</div>
304304

305305

306-
##### [Dependency Injection (DI)](#di)
306+
#### [Dependency Injection (DI)](#di)
307307
{: #di}
308308

309309
Die obigen Codebeispiele zeigen auch einen einfachen Fall von DI. $_POST ist eine Superglobale und technisch gesehen ist es nicht notwendig, sie als Parameter von Methoden (Konstruktor und setAge ()) zu übergeben, sie ist ohnehin in jedem Kontext verfügbar. Schauen wir uns mal das obige Beispiel an, wenn wir diese Variablen einfach im Objekt auslesen:
@@ -329,13 +329,13 @@ Die meisten nicht-trivialen Objekte, sind von anderen Objekten oder Vorgabewerte
329329
Die Antwort auf alle drei Fragen lautet: Geht nicht, das Funktionsprinzip ist fest verdrahtet, dazu muß der Code für das Userobjekt geändert werden.
330330

331331

332-
#### [Includes](#includes)
332+
### [Includes](#includes)
333333
{: #includes}
334334

335335
...
336336

337337

338-
#### [Templating](#templating)
338+
### [Templating](#templating)
339339
{: #templating}
340340

341341
...

code-optimizing/06_if.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ inhalt:
3636
---
3737

3838

39-
### [Mythos if-Schleife](#mythos-if-schleife)
39+
## [Mythos if-Schleife](#mythos-if-schleife)
4040
{: #mythos-if-schleife}
4141

4242
Zuerst sei ein oft vorkommender Mythos aufgeklärt:
@@ -49,7 +49,7 @@ Das Wesen einer Schleife ist die Wiederholung. `if` bildet einen Block aus Anwei
4949
`if` ist eine [Kontrollstruktur](http://php.net/manual/de/language.control-structures.php) aber deshalb noch lange keine Schleife.
5050

5151

52-
### [Notierung](#notierung)
52+
## [Notierung](#notierung)
5353
{: #notierung}
5454

5555
Die korrekte Notierung gemäß [PEAR Standard](http://pear.php.net/manual/de/standards.control.php) beschreibt die Angabe immer mit geschweiften/geschwungenen Klammern `{ }`.
@@ -67,7 +67,7 @@ if (Bedingung1) {
6767
~~~
6868

6969

70-
#### [Übliche Darstellung `if` / `else`](#uebliche-darstellung)
70+
### [Übliche Darstellung `if` / `else`](#uebliche-darstellung)
7171
{: #uebliche-darstellung}
7272

7373
Nachfolgend eine übliche Darstellung, diese entspricht einem *entweder / oder*.
@@ -81,7 +81,7 @@ if (!empty($_POST['action'])) {
8181
~~~
8282

8383

84-
#### [Etwas verkürzte Notierung mit default-Vorbelegung](#verkuerzte-notierung)
84+
### [Etwas verkürzte Notierung mit default-Vorbelegung](#verkuerzte-notierung)
8585
{: #verkuerzte-notierung}
8686

8787
Eine alternative, etwas kürzere Variante, mit Wert-Vorbelegung und Übersteuerung, wenn die Bedingung zutrifft.
@@ -94,7 +94,7 @@ if (!empty($_POST['action'])) {
9494
~~~
9595

9696

97-
#### [Bedingungsoperator (`?:`)](#bedingungsoperator)
97+
### [Bedingungsoperator (`?:`)](#bedingungsoperator)
9898
{: #bedingungsoperator}
9999

100100
Der Bedingungsoperator `?:` (auch Konditionaloperator) gehört zur Gruppe der ternären Operatoren (Operatoren mit drei Operanden). Da diese Gruppe in vielen Programmiersprachen lediglich diesen einen Operator umfasst, wird `?:` oftmals einfach nach dem Namen der Gruppe als „ternärer Operator“ bezeichnet.
@@ -122,11 +122,11 @@ Anmerkung: Die Klammerung der Bedingung ist syntaktisch nicht erforderlich, wird
122122
Bedingungsoperatoren finden häufig bei derartigen Zuweisungen Verwendung, weil auf diese Weise die Notwendigkeit wegfällt, die Variable vor einer `if`-Anweisung mit einem Standardwert belegen zu müssen, und weil gleichzeitig klar zu erkennen ist, dass die Variable unter allen Umständen mit einem Wert belegt wird.
123123

124124

125-
### [Syntaktische Fallstricke](#syntaktische-fallstricke)
125+
## [Syntaktische Fallstricke](#syntaktische-fallstricke)
126126
{: #syntaktische-fallstricke}
127127

128128

129-
#### [Nur ein Gleichheitszeichen `=`](#nur-ein-gleichheitszeichen)
129+
### [Nur ein Gleichheitszeichen `=`](#nur-ein-gleichheitszeichen)
130130
{: #nur-ein-gleichheitszeichen}
131131

132132
~~~ php
@@ -138,7 +138,7 @@ if ($ampel = "gruen") {
138138
Nur ein `=` Zeichen ist eine Zuweisung und würde immer als *true* gewertet. Zum direkten Vergleich sind zwei `==` oder drei `===` Zeichen nötig. Details dazu zum Thema *typschwacher* und *typsicherer* Vergleich gibt es [ebenfalls hier](http://php.net/manual/de/language.operators.comparison.php).
139139

140140

141-
#### [Schreibweise ohne geschweifte Klammern](#ohne-klammern)
141+
### [Schreibweise ohne geschweifte Klammern](#ohne-klammern)
142142
{: #ohne-klammern}
143143

144144
Ohne den geschweiften Klammern wird jeweils nur die erste Anweisung nach dem `if` ausgeführt. Nachfolgende Anweisungen werden, unabhängig davon, immer ausgeführt. Zur besseren Lesbarkeit wird grundsätzich von dieser Notaiton abgeraten, diese findet auch im [PEAR-Standard](http://pear.php.net/manual/en/standards.control.php) keine Anwendung.
@@ -152,7 +152,7 @@ if ($ampel == "gruen")
152152
~~~
153153

154154

155-
#### [Semikolon nach der Bedingung](#semikolon)
155+
### [Semikolon nach der Bedingung](#semikolon)
156156
{: #semikolon}
157157

158158
Ein Semikolon nach der Bedingung beendet für PHP die Anweisung sofort. Somit werden alle nachfolgende Anweisungen ausgeführt.
@@ -167,11 +167,11 @@ echo "Nein";
167167
~~~
168168

169169

170-
### [Unnötige Konstrukte](#unnoetige-konstrukte)
170+
## [Unnötige Konstrukte](#unnoetige-konstrukte)
171171
{: #unnoetige-konstrukte}
172172

173173

174-
#### [Unnötige Prüfungen zu bool (*true* oder *false*) hin](#pruefung-zu-bool)
174+
### [Unnötige Prüfungen zu bool (*true* oder *false*) hin](#pruefung-zu-bool)
175175
{: #pruefung-zu-bool}
176176

177177
Das Audruck in der Klammer `( )` nach dem `if` wird direkt immer zu *true* oder *false* ausgewertet. Mit diesem Hintergrundwissen fällt auf, das es oft unnötige Anwendungen des `if` Konstruktes gibt.

code-optimizing/08_string-vergleiche.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Dies klappt auch in den meisten Fällen, aber leider nicht immer. <br>
5050
Weniger bekannt ist: PHP prüft den vor den einfachen (typschwachen) Vergleich beide Stringinhalte, ob diese einen numerischen Inhalt haben. Sind beide Stringinhalte numerisch, wird auch ein numerischer Vergleich durchgeführt. So auch wenn eine Seite ein numerischer Datentyp ist, was allgemein bekannt ist.
5151

5252

53-
### [Beispiele typschwacher Stringvergleiche](#beispiel-typschwach)
53+
## [Beispiele typschwacher Stringvergleiche](#beispiel-typschwach)
5454
{: #beispiel-typschwach}
5555

5656
~~~php
@@ -67,7 +67,7 @@ Wie die Beispiele zeigen, werden auch Hexadezimalausdrücke als numerisch angese
6767
Diese Stolperfallen lauern versteckt auch in anderen Konstrukten, wie z.B. `switch` oder `usort`. Dazu die folgenden Beispiele.
6868

6969

70-
### [Beispiel switch](#beispiel-switch)
70+
## [Beispiel switch](#beispiel-switch)
7171
{: #beispiel-switch}
7272

7373
~~~php
@@ -110,7 +110,7 @@ switch (true) {
110110
~~~
111111

112112

113-
### [Beispiel usort](#beispiel-usort)
113+
## [Beispiel usort](#beispiel-usort)
114114
{: #beispiel-usort}
115115

116116
~~~php
@@ -147,14 +147,14 @@ var_dump($a3);
147147
Das Beispiel zeigt deutlich, dass `usort` bei Verwendung der Vergleichsfunktion `cmp` mit dem typschwachen Vergleich nicht das gewünschte Resultat bringt. `sort` und `usort` mit `cmpStr`, welche `strcmp` benutzt, arbeiten richtig.
148148

149149

150-
### [Fazit](#fazit)
150+
## [Fazit](#fazit)
151151
{: #fazit}
152152

153153
Für den sicheren Stringvergleich auf Gleich/Ungleich kann nur der strenge Vergleich `===` bzw. `!==` empfohlen werden.
154154
Wird in den obigen ersten Beispielcode konsequent `===` benutzt, bleibt die Ausgabe leer. Für einen größer/kleiner Vergleich von Strings bleibt nur `strcmp` zu nehmen.
155155

156156

157-
### [Quelle](#quelle)
157+
## [Quelle](#quelle)
158158
{: #quelle}
159159

160160
* [Forumsbeitrag von jspit](http://www.php.de/php-einsteiger/95512-fallstricke-bei-typeschwachen-stringvergleichen.html)

0 commit comments

Comments
 (0)