mitmario.dev

Rechnen

PHP Sandbox 3 Min Lesezeit 4 BeispieleLektion 1 von 7

Rechnen ist das, wofür Computer ursprünglich gebaut wurden, und in PHP sieht es aus wie auf dem Papier. Du brauchst dafür ein paar Zeichen, eine Regel über die Reihenfolge und zwei Abkürzungen, die dir in fremdem Code ständig begegnen.

Die Rechenzeichen

Die Grundrechenarten und zwei Zugaben
<?php

$a = 10;
$b = 3;

echo "$a + $b  = ", $a + $b, "\n";
echo "$a - $b  = ", $a - $b, "\n";
echo "$a * $b  = ", $a * $b, "\n";
echo "$a / $b  = ", $a / $b, "\n";
echo "$a % $b  = ", $a % $b, "\n";
echo "2 hoch 10 = ", 2 ** 10, "\n";

Plus, minus, mal, geteilt sind +, -, * und /. Dazu kommen zwei, die auf keiner Tastatur beschriftet sind. ** ist die Potenz, 2 ** 10 ergibt also 1024. Und % liefert den Rest bei der Division: 10 % 3 ist 1, weil die 3 zweimal in die 10 passt und eins übrig bleibt.

Das Prozentzeichen heißt hier also nicht Prozent. Diese Verwechslung macht man einmal und danach nie wieder. Wer 19 Prozent von 100 will, rechnet 100 * 19 / 100, nicht 100 % 19.

Der Rest klingt nach Mathematikunterricht, ist aber eines der Werkzeuge, die du am häufigsten brauchst. Jede zweite Tabellenzeile einfärben, prüfen ob eine Zahl gerade ist, eine Liste auf Seiten aufteilen, Sekunden in Minuten umrechnen: überall steckt % drin. Zusammen mit intdiv aus Lektion 2.3 ergibt es ein Paar. intdiv sagt dir, wie oft etwas hineinpasst, % sagt dir, was danach übrig ist.

Bei der Division lohnt noch ein zweiter Blick auf die Ausgabe. 10 / 3 zeigt 3.3333333333333, also dreizehn Dreien und dann Schluss. Das ist nicht das Ende der Zahl, sondern die Rundung beim Ausgeben, die du aus Lektion 2.3 kennst. Wer den Rest sehen will, tippt php -r 'var_dump(10 / 3);' im Terminal: float(3.3333333333333335), eine Stelle mehr, und die ist keine Drei.

Punkt vor Strich

Punkt vor Strich, und was Klammern daran ändern
<?php

$preis = 20;
$menge = 3;
$versand = 5;

echo "2 + 3 * 4 ergibt ", 2 + 3 * 4, "\n";
echo "(2 + 3) * 4 ergibt ", (2 + 3) * 4, "\n";

echo "Ohne Klammern: ", $preis * $menge + $versand, "\n";
echo "Mit Klammern:  ", $preis * ($menge + $versand), "\n";

PHP rechnet wie du in der Schule: erst Potenz, dann Punkt, dann Strich. 2 + 3 * 4 ergibt also 14 und nicht 20.

Das klingt harmlos, bis ein Betrag daran hängt. Die letzten beiden Zeilen im Beispiel unterscheiden sich nur durch ein Klammerpaar, und heraus kommen 65 und 160. Eine der beiden Zahlen wäre auf einer Rechnung eine sehr unangenehme Überraschung.

Setz im Zweifel Klammern, auch dort, wo sie rechnerisch überflüssig sind. Sie kosten nichts, und wer die Zeile später liest, muss nicht überlegen. Diese Person bist überraschend oft du selbst.

Zwei Abkürzungen

Kurzformen beim Hochzählen
<?php

$summe = 100;
$summe += 5;
$summe -= 20;
echo "Summe: $summe\n";

$i = 5;
echo "Erst zeigen, dann zaehlen: ", $i++, " und danach steht $i drin\n";

$j = 5;
echo "Erst zaehlen, dann zeigen: ", ++$j, " und danach steht $j drin\n";

$summe = $summe + 5; schreibt in der Praxis niemand aus. Die Kurzform heißt $summe += 5;, und es gibt sie für alle vier Grundrechenarten: -=, *=, /=.

Für den häufigsten Fall, eins dazu, gibt es eine noch kürzere Form: $i++. Und die hat eine Zwillingsschwester, ++$i. Solange die Zeile nichts weiter tut als hochzählen, sind beide gleichwertig.

Anders wird es, sobald du das Ergebnis in derselben Zeile benutzt. $i++ gibt den alten Wert heraus und zählt danach hoch. ++$j zählt zuerst hoch und gibt den neuen Wert heraus. Im Beispiel steht beides untereinander: einmal erscheint eine 5, einmal eine 6, und hinterher steht in beiden Variablen dieselbe 6.

Auswendig lernen musst du das nicht. Erkennen solltest du es aber, denn das ist eine der Zeilen, an denen jemand eine Stunde sucht, weil eine Zählung um genau eins danebenliegt.

Teilen durch null

Teilen durch null
<?php

$gesamt = 100;
$teiler = 0;

echo "Vor der Rechnung\n";
echo $gesamt / $teiler;
echo "Diese Zeile wird nie erreicht\n";

Früher war das eine Warnung. Das Programm lief weiter und rechnete mit Unsinn weiter, was die schlechtere von beiden Möglichkeiten ist.

Seit PHP 8 ist es ein Fatal error. Auf dem Fehlerkanal steht Uncaught DivisionByZeroError, das Skript bricht an genau dieser Zeile ab, und der Exit-Code ist 255. Beides kennst du aus Lektion 1.4, und die letzte Zeile im Beispiel wird tatsächlich nie erreicht.

Das ist eine gute Nachricht. Ein Programm, das abbricht, zeigt dir die Zeile, in der etwas nicht stimmt. Ein Programm, das weiterläuft, zeigt dir drei Bildschirme später einen falschen Betrag, und dann suchst du an der falschen Stelle.

Für % gilt dasselbe, auch dort ist eine Null als Teiler ein Fehler. Abfangen lässt sich beides, indem man vor der Rechnung nachsieht, ob der Teiler null ist. Das Werkzeug dafür bekommst du in Abschnitt 4.

Zum Mitnehmen

Rechnen sieht in PHP aus wie auf dem Papier, mit zwei Zeichen, die es auf dem Papier nicht gibt. Das wichtigere von beiden ist der Rest bei der Division, und den brauchst du öfter, als der Name vermuten lässt.

Jetzt du

Basis Konto, kostenlos

Zu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.

Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.

In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.

Was in dieser Lektion steckt

  • Artikel mit 4 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.