Bernd: 001 = 1 und password_hash

Beitrag lesen

Hi,

Nein, eben nicht, denn die linke Zeichenkette ist ja nicht identisch der rechten!

Stimmt, sie ist nicht identisch. Aber laut der Beschreibung aus der PHP Doku die ich ja schrieb:

$a == $b ist gleich. Gilt für $a = '01' und $b = '1'. // true

Der Operator === sagt nach der Beschreibung von php.net:
$a == $b ist gleich // true, siehe oben
... und es muss der gleiche Typ sein:
gettype($a) == gettype($b) // string, true

Das macht sie doch dann "identisch". Ansonsten ist die deutsche Übersetzung schlecht, wenn er auch die Länge betrachten sollte. Denn das steht in der Beschreibung ja nicht drinnen. Und warum sollte er bei === die länge beachten und bei == nicht. Meines erachtens ein Fehler bei PHP.

Und der Pre-Parser fasst die "Zahlen" nicht an, um ggf. eine Oktalzahl daraus zu machen, da er sie ja bereits als Zeichenketten erkannt hat.

Ja.

Erst durch den Operator '==' wird der Mechanismus der Typumwandlung angestoßen. Die Funktion strlen() enthält aber keinen Operator. Darum führt die auch keine Typumwandlung durch!

Typumwandlung:
$z = '01';
$y = '1';
strlen($z) // 2
strlen($y) // 1

if($z == $y) // "Typ umgewandelt"

strlen($z) // 2
strlen($y) // 1

Es geht ja nicht um eine Typumwandlung mit strlen, sondern nachzuweisen, dass der string der schon vor dem == ein string war ($_GET kommt immer als string) ein string ist und nicht gleich dem anderen ist. Das er verschiedene längen hat, also nicht gleich ist. Es geht ja nichtmal um den Typ. Es geht darum, dass sie nicht gleich sind wegen verschiedener längen und deshalb $z nicht $y sein kann, weil sie nicht gleich sind.

Alle Klarheiten beseitigt?

Nein. ^^

Wenn PHP in (Turbo-)Pascal geschrieben wäre und nicht in C, dann wäre alles anders :-)
Dort gibt es keine Überladung und außerdem ist es ein typenstrenge Sprache. Man darf mit Mühe und Not mal gerade explizites Typecasting betreiben.

Deine Aufgabe :)) Ich unterstütze dich auch beim Turbo PHP.

mfg
Bernd