htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);+
htmlspecialchars($string, double_encode: false);+
/**
+* @Route("/api/posts/{id}", methods={"GET", "HEAD"})
+*/
+classUser
+{
+ #[Route("/api/posts/{id}", methods: ["GET", "HEAD"])]
+class User
+{
+ In plaats van PHPDoc commentaar kun je nu gestructureerde meta-data opnemen met deze nieuwe PHP syntax.
+class Point {
+ public float $x;
+ public float $y;
+ public float $z;
+
+ public function __construct(
+ float $x = 0.0,
+ float $y = 0.0,
+ float $z = 0.0,
+ ) {
+ $this->x = $x;
+ $this->y = $y;
+ $this->z = $z;
+ }
+}
+ class Point {
+ public function __construct(
+ public float $x = 0.0,
+ public float $y = 0.0,
+ public float $z = 0.0,
+ ) {}
+}
+ Minder franje nodig voor het definiëren en initialiseren van objecten.
+class Number {
+ /** @var int|float */
+ private $number;
+
+ /**
+ * @param float|int $number
+ */
+ public function __construct($number) {
+ $this->number = $number;
+ }
+}
+
+new Number('NaN'); // Ok
+ class Number {
+ public function __construct(
+ private int|float $number
+ ) {}
+}
+
+new Number('NaN'); // TypeError
+ In plaats van PHPDoc commentaar voor een variabele met meerdere toegestane typen, kun je de nieuwe union type + declaraties gebruiken die door PHP gevalideerd worden.
+switch (8.0) {
+ case '8.0':
+ $result = "Oh no!";
+ break;
+ case 8.0:
+ $result = "This is what I expected";
+ break;
+}
+echo $result;
+//> Oh no!
+ echo match (8.0) {
+ '8.0' => "Oh no!",
+ 8.0 => "This is what I expected",
+};
+//> This is what I expected
+ De nieuwe match lijkt op een switch, maar heeft de volgende afwijkende eigenschappen:
+$country = null;
+
+if ($session !== null) {
+ $user = $session->user;
+
+ if ($user !== null) {
+ $address = $user->getAddress();
+
+ if ($address !== null) {
+ $country = $address->country;
+ }
+ }
+}
+ $country = $session?->user?->getAddress()?->country;+
In plaats van allemaal losse controles op nulls kun je nu elementen blijven chainen met de nieuwe nullsafe operator. Wanneer + het evalueren van één van de elementen faalt, faalt de hele chain direct en evalueert deze naar null.
+0 == 'foobar' // true+
0 == 'foobar' // false+
Als je in PHP 8 iets met een string vergelijkt, is de vergelijking afhankelijk van de waarde van de string. Als deze + numeriek is wordt een numerieke vergelijking gebruikt, anders wordt het nummer naar string omgezet en worden deze als + strings vergeleken.
+strlen([]); // Warning: strlen() expects parameter 1 to be string, array given + +array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0+
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given + +array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0+
De meeste PHP functies gooien nu Fatal Error excepties wanneer de validatie van een parameter faalt.
++ PHP 8 bevat twee nieuwe JIT compilers. De meest veelbelovende, Tracing JIT, heeft in synthetische tests een driemaal + betere performance en in een aantal specifieke lang-draaiende applicaties een 1.5 tot tweemaal beter performance. + Typische applicaties draaien minimaal even goed als op PHP 7.4. +
+
+
+