dedlfix: variable in $_post["variable"_konstante]

Beitrag lesen

echo $begrüßung;

Kamst du nicht ins Grübeln, wie man wohl aus Dezimalzahlen eindeutig und vor allem ohne großartige Rechnereien[*] ermitteln kann, ob eine bestimmte Zahl zur Bildung der Summe genutzt wurde, ohne die Bits ihrer Binärdarstellung zu beachten?

Dieser Satz hat mich ins Grübeln gebracht.

Die Werte der error_reporting-Konstanten sind alle (E_ALL mal ausgenommen) auffallend Ergebnisse von Zweierpotenzen. In Binärdarstellung ergeben sie

E_ERROR             1 000000000001
E_WARNING           2 000000000010
E_PARSE             4 000000000100
E_NOTICE            8 000000001000
E_CORE_ERROR       16 000000010000
E_CORE_WARNING     32 000000100000
E_COMPILE_ERROR    64 000001000000
E_COMPILE_WARNING 128 000010000000
E_USER_ERROR      256 000100000000
E_USER_WARNING    512 001000000000
E_USER_NOTICE    1024 010000000000
(E_ALL           2047 011111111111)
E_STRICT         2048 100000000000

Wie zu sehen ist, ist immer genau ein Bit gesetzt, die anderen nicht. Fasst man zwei oder mehr Werte durch Addition oder OR-Verknüpfung zusammen bleiben die gesetzten Bits erhalten.

E_WARNING           2 000000000010
E_CORE_WARNING     32 000000100000
E_USER_WARNING    512 001000000000
                  546 001000100010

Man kann also eindeutig aus der 546 erkennen, dass E_WARNING, E_CORE_WARNING und E_USER_WARNING gemeint sind. Hätte man nur das Dezimalsystem zur Verfügung müsste man von der 546 alle definierten Werte, also 512, 256, 128, 64, 32, 16, 8, 4, 2 und 1 (1024 bis 2048 kann man sich sparen) der Reihe nach und vom größten zum kleinsten durchgehen und subtrahieren ... [viele Worte, die ich grad nicht ausformulieren will]. In Kurzform sieht das so aus:

  • Der nächst kleinere Wert zu 546 ist 512, also E_USER_WARNING gemerkt und gerechnet: 546-512 = 34.
  • 256, 128, 64 scheiden aus, weil sie größer als 34 sind.
  • 32 passt, also E_CORE_WARNING gemerkt und gerechnet: 34-32 = 2
  • 16, 8, 4 scheiden aus
  • 2 passt, also E_WARNING gemerkt und gerechnet: 2-2 = 0
  • 1 scheidet auch aus

Wie du siehst ist das viel Aufwand.

Und nun kannst du dir sicher auch denken, warum der Defaut-Wert von error_reporting in der php.ini-dist als E_ALL & ~E_NOTICE (AND NOT(bzw. Komplement)) dargestellt ist, wie sich die Bits bei dieser Rechnung verhalten und PHP anhand des Ergebnisses weiß, welche Fehler es anzeigen soll.

echo "$verabschiedung $name";