1. Verbinden von unterschiedlichen Bedingungen
Eine Überprüfung eines Sachverhalts ist manchmal
aus mehreren unabhängigen Bedingungen zusammengesetzt. In PHP können
diese atomaten Bedingungen (z.B. Vergleiche oder schon vorher berechnete
boolische Ausdrucke) miteinander kombiniert werden um eine gewünschte
Abfrage zu erhalten. Theoretisch gibt es für 2 Variablen 16 verschiedene
Funktionen, die für 2 Werte true
oder
false
zurückliefern. In der realen Welt verwendet man
üblicherweise nur 7 solcher Kombinationen/Funktionen die sich in
3 Grundkombinationen und 4 erweiterte Kombinationen aufteilen.
PHP implementiert davon 4, alle anderen Kombinationen können jedoch
aus Kombinationen dieser Grundfunktionen von Hand dargestellt werden.
2. AND-Verknüpfung
Die AND-Verknüpfung ist die einfachste logische
Verknüpfung. Das Ergebnis solch einer Verknüpfung liefert true
wenn beide Argumente true
sind. Im Sprachgebrauch
verwendet man AND intuitiv genau so, wie z.B. bei
Du darfst draußen spielen wenn du deine Hausaufgaben gemacht hast
und dein Zimmer aufgeräumt ist. In PHP wird diese Verknüpfung
mit dem AND
-Operator realisiert.
<?php
$var = false and false; // erzeugt false
$var = false and true; // erzeugt false
$var = true and false; // erzeugt false
$var = true and true; // erzeugt true
$spielen = $hausaufgaben_fertig and $zimmer_aufgeraeumt;
?>
Dies kann man auch in einer Wahrheitstabelle darstellen, eine gängige Entwurfstechnik.
Argument 1 (A) | Argument 2 (B) | Ergebnis (Q) |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
In der Digitaltechnik verwendet man besondere Diagramme die diese Verkettungen benutzen. Eine AND-Verknüpfung hat z.B. folgende Darstellung.
Anhand des &
-Zeichen erkennt man auch dass es sich
hierbei um eine AND-Verknüpfung ist. Links sind die beiden
Eingänge (könnten übrigens auch mehr sein, PHP kann jedoch nur 2 verwalten)
A
und B
und rechts ist der Ausgang Q
.
3. OR-Verknüpfung
Eine OR-Verknüpfung ist die zweite Standardverknüpfung
in PHP der mit dem Schlüsselwort or
realisiert wird. Der
natürliche Sprachgebrauch ist jedoch irreführend bei einer
OR-Verknüpfung. Eine Fußgängerampel schaltet auf grün
wenn der eine Knopf oder der andere Knopf gedrückt wird. Umbewusst spricht
man hier jedoch von einem exklusiven Ausschluss, entweder den einen
oder den anderen Knopf drücken. Jedoch würde die Ampel rein
theoretisch auch schalten, wenn beide Knöpfe gleichzeitig gedrückt werden.
Und so arbeitet auch der or
-Operator. Er liefert true
wenn mindestens einer der beiden Werte/Parameter true
sind.
<?php
$var = false or false; // liefert false
$var = false or true; // liefert true
$var = true or false; // liefert true
$var = true or true; // liefert true
$gruen_schalten = $knopf1 or $knopf2;
?>
Die Wahrheitstabelle sieht wie folgt aus
Argument 1 (A) | Argument 2 (B) | Ergebnis (Q) |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
In der Digitaltechnik verwendet man folgendes Schaltzeichen.
Wenn man die Eingänge mit 0
oder
1
belegt, sieht man den Sinn an >=1
.
Wenn man also die Eingünge zusammen addiert so muss man
mit der Summe über 0 kommen damit am Ausgang eine 1
kommt.
4. NOT-Operator
Der NOT-Operator ist ein Operator der nur einen
Wert benötigt, nicht wie die anderen beiden Operatoren zwei. Daher
gibt es auch nur 2 mögliche Kombinationen, entweder der Wert für
den Parameter ist true
oder false
. In PHP
wird dieser Operator mit dem Zeichen !
erzeugt, der
zu prüfende Wert wird dann dahinter geschrieben. Das
Ergebnis dieses Operators ist die Negation vom verwendeten Wert.
Also aus true wird false und umgekehrt. Nehmen wir als
Beispiel eine Laplace-Münze.
Diese fällt entweder auf Kopf oder Zahl. Wenn sie
auf Kopf fällt kann sie nicht auf Zahl fallen und
umgekehrt.
<?php
$ist_kopf = !$ist_zahl;
?>
Dieses !
hat man schon bei den Vergleichsoperatoren
!=
und !==
kennengelernt. Letzendlich könnte man
diese Operatoren auch wie folgt schreiben.
<?php
$var = $x != $y; // mit !=
$var = !($x == $y); // mit !(==) (Klammer sind nötig sonst wird nur die Variable $x negiert)
?>
Die Wahrheitstabelle fällt entsprechend kürzer aus.
Argument (A) | Ergebnis (Q) |
---|---|
0 | 1 |
1 | 0 |
In der Digitaltechnik wird folgendes Schaltzeichen verwendet.
Wichtig hierbei ist nicht die 1
(das ist
mehr oder weniger ein neutrales Element wie die 1 für eine
Multiplikation oder 0 für eine Addition) sondern der kleine
Kreis hinter dem Schaltzeichen. Er zeichnet die eigentliche
Negation an, in diesem Fall am Ausgang des Elements.
Dies heißt auch das der Kreis für ein Eingang verwendet werden kann,
dass das logische Signal (1/0 bzw. true/false)
negiert.
5. NAND-Verknüpfung
Neben den 3 Grundverknüpfungen ist NAND ein erweiterte Verknüpfung. Sie wird aus den Grundverknüpfungen AND und NOT gebildet. In PHP gibt es kein solchen Operator kann aber entsprechend zusammengebaut werden.
<?php
$check = !($var1 and $var); // AND -> NOT = NAND
$check = !$var1 and $var; // kein NAND, hier wird erst $var1 negiert und
// dann zu 'and' gepackt.
?>
In der Digitaltechnik wird folgendes Schaltzeichen verwendet.
Anhand des Schaltzeichens erkennt man auch die Verkettung der Verknüpfungen AND und NOT. Die Tabelle zeigt auch die interne Verkettung dieser Operatoren.
Argument 1 (A) | Argument 2 (B) | Ergebnis (Q) |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
6. NOR-Verknüpfung
Die NOR-Verknüpfung ist eine weitere erweiterte Verknüpfung, die
selbe wie NAND nur in grün, also OR
und NOT verkettet. PHP kennt für diese Art der
Verknüpfung auch keinen eigenen Operator und wird entsprechend auch
mit or
und !
erzeugt.
<?php
$check = !($var1 or $var); // OR -> NOT = NOR
$check = !$var1 or $var; // kein NOR, hier wird erst $var1 negiert und
// dann zu 'or' gepackt.
?>
Und auch in der Digitaltechnik verwendet man die selbe Idee wie beim NAND.
Die Wahrheitstabelle ist auch entsprechend aufgebaut.
Argument 1 (A) | Argument 2 (B) | Ergebnis (Q) |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 0 |
7. XOR-Verknüpfung
Die dritte erweiterte Verknüpfung ist die XOR-Verknüpfung. Sie
arbeitet wie eine OR-Verknüpfung, jedoch darf nur ein
Wert true
sein. Wenn beide Werte true
sind liefert
diese Verknüpfung false
.
<?php
$check = ($var1 and !$var2) or (!$var1 and $var2);
?>
Da niemand bereit ist so eine Verkettung von bereits vorhandenen Verknüpfungen
hinzuschreiben gibt es in PHP dafür die Verknüpfungszeichenkette xor
.
Das x
steht dabei für exclusive.
<?php
$check = false xor false; // false
$check = true xor false; // true
$check = false xor true; // true
$check = true xor true; // false
$geschlecht_gueltig = $ist_m xor $ist_w;
?>
In der Digitaltechnik gibt es auch ein eigenes Schaltzeichen.
Das =1
deutet an, dass die Summe nur 1
sein darf (wenn
man denn im Kopf die Werte zusammenaddiert). Dies entspricht also genau dem
Verhalten einer XOR-Verknüpfung.
Argument 1 (A) | Argument 2 (B) | Ergebnis (Q) |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
8. XNOR-Verknüpfung
Die XNOR-Verknüpfung ist wiederum sehr einfach. Es ist einfach eine Negation der XOR-Verknüpfung, wird genauso realisiert und genauso dargestellt.
<?php
$check = !(false xor false); // true
$check = !(false xor true); // false
$check = !(true xor false); // false
$check = !(true xor true ); // true
?>
Das Schaltzeichen in der Digitaltechnik sieht dann entsprechend aus.
Und die Wahrheitstabelle auch.
Argument 1 (A) | Argument 2 (B) | Ergebnis (Q) |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
9. Vereinfachungsregeln
In der Digitaltechnik gibt es einige Rechenregeln mit denen man längere boolische Ausdrücke vereinfachen kann. Diese kann man ggf. auch auf PHP-Skripte anwenden.
<?php
$check = true and $var; /* ist das selbe wie: */ $check = $var; // da das true 'nichts bringt'
$check = false and $var; /* ist das selbe wie: */ $check = false; // da bereits ein false drin ist
$check = true or $var; /* ist das selbe wie: */ $check = true; // da bereits ein true drin ist
$check = false or $var; /* ist das selbe wie: */ $check = $var; // da das false 'nichts bringt'
?>
Dann gibt es z.B. noch sowas wie Doppelnegation.
<?php
$check = !(!$check); // ähnlich wie 'minus mal minus ergibt plus'
?>
Wichtiger sind jedoch die De Morgansche Gesetze. Bei einem bestimmten Aufbau von einer AND- oder OR-Verknüpfung kann man diese Verknüpfungen in eine OR- oder AND-Verknüpfung umschreiben.
<?php
$check = !$var1 and !$var2;
$check = !($var1 or $var2); // das gleiche
$check = !($var1 and $var2);
$check = !$var1 or !$var2; // das gleiche
?>
Man zieht also die Negation rein bzw. raus und muss dabei die Verknüpfung von AND auf OR (bzw. umgekehrt) ändern. Dies macht man in seinen Skripten um die Lesbarkeit zu erhöhen.
<?php
$ueberspringen = !(('.' != $var) and ('..' != $var)); // was prüf ich hier nun? es soll nicht gleichzeitig zwei werte gelten? hä?
$ueberspringen = !(!(('.' == $var) or ('..' == $var))); // doppelnegation auflösen
$ueberspringen = ('.' == $var) or ('..' == $var); // achso... das ist lesbarer...
?>