Professor Hase: Kann man PHP Header Angabe und Namespace Festlegung includen?

Beitrag lesen

Hi Dedlfix!

Danke für Deine Antwort! Auf der von Dir verlinkten Seite war ich heute auch schon. Meine falsche Annahme mit den älteren PHP Versionen hatte ich wohl durch ein zu schnelles Lesen des Englischen Textes dort.

Ältere Versionen haben in der Regel keine Ahnung davon, was in zukünftigen Versionen hinzugefügt wurde. Neue Elemente sehen sie deshalb als Sysntaxfehler an.

Das ist eigentlich logisch, natürlich! Danke! Ich verstehe die Sache trotzdem nicht. Dort steht:

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. Die kommt, wie auf der Seite richtigerweise steht, erst, wenn man das

declare(strict_types=1);

davor setzt. Dann kommt ein "Uncaught TypeError: Return value of bar() must be of the type string ..." zurück. OK, jetzt wandle ich die Funktion etwas um:

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 ..."!

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.)

Zusammengefasst:

1.) Wieso gibt es hier bei 2 gleich falschen Typenverwendungen unterschiedliches Error-Verhalten?

2.) Warum wird in Beispiel 1 der Integer zu einem String umgewandelt, wenn der Modus nicht aktiviert ist? Wenn doch angeblich dann alles "ignoriert" wird!

3.) Also was bringt die Modus-Aktivierung dann wirklich?

Professor Hase

PS: Ich bin anscheinend zu dämlich für dieses Forum! Ich schaffe es nicht, ein Syntax Highlighting des Codes in den Postings hinzubekommen! Die "Erklärung" auf der Hilfeseite ist sowas von unverständlich! Das ist nicht sehr intuitiv gelöst! 😕

Edit Rolf B: Jetzt stimmt's 😀 Hinter das einleitende ~~~ muss ein php