dedlfix: Kann man PHP Header Angabe und Namespace Festlegung includen?

Beitrag lesen

Tach!

Developers can turn strict types on by placing the declare(strict_types=1); method at the top of a PHP file. This implementation means that PHP will 'ignore' type hints and return types unless the declare(strict_types=1); statement appears at the top of the file.

Und das mit dem "ignore" stimmt so einfach nicht. Zumindest nicht in jedem Fall. Nehmen wir das Beispiel auf der genannten Seite:

function bar(int $foo): string
	{
		return $foo;
	}
$result_1 = bar(123);

Das gibt den String '123' zurück. Da wird also gar nichts ignoriert! Da wird umgewandelt. Aber zumindest kommt keine Fehlermeldung.

PHP ignoriert die Typen, also setzt sie nicht strikt durch und macht einfach eine Typumwandlung entsprechend der angegebenen Type Hints.

function foo(string $bar): int
	{
		return $bar;
	}
$result_2 = foo('test');

Und hier kommt nun sofort eine Fehlermeldung! Auch ohne, dass ich den Strict Type Modus explizit aktiviere! Das Resultat liefert sofort ein "Uncaught TypeError: Return value of foo() must be of the type int ..."!

Ja, bei 'test', aber nicht bei 123 oder '123'. Und bei '123test' kommt auch nur eine Notice.

Mit Type Hints ist PHP wohl etwas strenger, was das Kovertieren in andere Typen angeht als bei Umwandlungen ohne Type Hints. Beispielsweise lässt sich echo (int)'test'; fehlermeldungslos ausführen, und das Ergebnis ist 0.

Es ist mir wirklich absolut unverständlich, warum es hier 2 verschiedene Reaktionen gibt beim Verarbeiten des Skripts. Und ich frage mich weiterhin, wozu das Aktivieren des Strict Type Modus nun gut sein soll, wenn der Alarm auch ohne die Zeile losgeht. (Zumindest bei Beispiel 2.)

Wenn du den Strict Mode aktivierst, wandelt PHP nicht selbständig die Typen.

dedlfix.