1<?php 2$_SERVER['BASE_PAGE'] = 'releases/8.0/de.php'; 3include_once __DIR__ . '/common.php'; 4 5releases\php80\common_header( 6 'PHP 8.0 ist ein Major-Update der Sprache PHP. ' . 7 'Es beinhaltet viele neue Funktionen und Optimierungen wie beispielsweise ' . 8 'Named Arguments, Union Types, Attribute, Constructor Property Promotion, ' . 9 'Match Ausdrücke, Nullsafe Operator, JIT und Verbesserungen des Typen-Systems, ' . 10 'der Fehlerbehandlung und der Konsistenz.'); 11 12?> 13<section class="php8-section php8-section_dark php8-section_header center"> 14 <div class="page-tools"> 15 <div class="change-language"> 16 <?php releases\php80\language_chooser('de'); ?> 17 </div> 18 </div> 19 <div class="php8-section__content"> 20 <div class="php8-logo"> 21 <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343"> 22 </div> 23 <div class="php8-title">Released!</div> 24 <div class="php8-subtitle"> 25 PHP 8.0 ist ein Major-Update der Sprache PHP.<br class="display-none-md"> Es beinhaltet viele neue Funktionen 26 und Optimierungen wie beispielsweise Named Arguments, Union Types, Attribute, Constructor Property Promotion, 27 Match Ausdrücke, Nullsafe Operator, JIT und Verbesserungen des Typen-Systems, der Fehlerbehandlung und der 28 Konsistenz. 29 </div> 30 <div class="php8-button-wrapper center"> 31 <a class="php8-button php8-button_light" href="/downloads">Wechsle jetzt zu PHP 8!</a> 32 </div> 33 </div> 34</section> 35 36<section class="php8-section center"> 37 <div class="php8-compare"> 38 <h2 class="php8-h2" id="named-arguments"> 39 Named Arguments 40 <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a> 41 </h2> 42 <div class="php8-compare__main"> 43 <div class="php8-compare__block example-contents"> 44 <div class="php8-compare__label">PHP 7</div> 45 <div class="php8-code phpcode"> 46 <?php highlight_php_trimmed( 47 'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);', 48 );?> 49 </div> 50 </div> 51 <div class="php8-compare__arrow"></div> 52 <div class="php8-compare__block example-contents"> 53 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 54 <div class="php8-code phpcode"> 55 <?php highlight_php_trimmed( 56 'htmlspecialchars($string, double_encode: false);', 57 );?> 58 </div> 59 </div> 60 </div> 61 <div class="php8-compare__content"> 62 <ul> 63 <li>Gib nur notwendige Parameter an, überspringe optionale.</li> 64 <li>Parameter sind unabhängig von der Reihenfolge und selbstdokumentierend.</li> 65 </ul> 66 </div> 67 </div> 68 69 <div class="php8-compare"> 70 <h2 class="php8-h2" id="attributes"> 71 Attribute 72 <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> <a class="php8-rfc" href="/manual/de/language.attributes.php">Doc</a> 73 </h2> 74 <div class="php8-compare__main"> 75 <div class="php8-compare__block example-contents"> 76 <div class="php8-compare__label">PHP 7</div> 77 <div class="php8-code phpcode"> 78 <?php highlight_php_trimmed( 79 'class PostsController 80{ 81 /** 82 * @Route("/api/posts/{id}", methods={"GET"}) 83 */ 84 public function get($id) { /* ... */ } 85}', 86 );?> 87 </div> 88 </div> 89 <div class="php8-compare__arrow"></div> 90 <div class="php8-compare__block example-contents"> 91 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 92 <div class="php8-code phpcode"> 93 <?php highlight_php_trimmed( 94 'class PostsController 95{ 96 #[Route("/api/posts/{id}", methods: ["GET"])] 97 public function get($id) { /* ... */ } 98}', 99 );?> 100 </div> 101 </div> 102 </div> 103 <div class="php8-compare__content"> 104 <p>Anstelle von PHPDoc Annotations kannst du nun strukturierte Meta-Daten in nativer PHP Syntax nutzen.</p> 105 </div> 106 </div> 107 108 <div class="php8-compare"> 109 <h2 class="php8-h2" id="constructor-property-promotion"> 110 Constructor Property Promotion 111 <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> <a class="php8-rfc" href="/manual/de/language.oop5.decon.php#language.oop5.decon.constructor.promotion">Doc</a> 112 </h2> 113 <div class="php8-compare__main"> 114 <div class="php8-compare__block example-contents"> 115 <div class="php8-compare__label">PHP 7</div> 116 <div class="php8-code phpcode"> 117 <?php highlight_php_trimmed( 118 'class Point { 119 public float $x; 120 public float $y; 121 public float $z; 122 123 public function __construct( 124 float $x = 0.0, 125 float $y = 0.0, 126 float $z = 0.0 127 ) { 128 $this->x = $x; 129 $this->y = $y; 130 $this->z = $z; 131 } 132}', 133 );?> 134 </div> 135 </div> 136 <div class="php8-compare__arrow"></div> 137 <div class="php8-compare__block example-contents"> 138 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 139 <div class="php8-code phpcode"> 140 <?php highlight_php_trimmed( 141 'class Point { 142 public function __construct( 143 public float $x = 0.0, 144 public float $y = 0.0, 145 public float $z = 0.0, 146 ) {} 147}', 148 );?> 149 </div> 150 </div> 151 </div> 152 <div class="php8-compare__content"> 153 <p>Weniger Codewiederholungen für das Definieren und Initialisieren von Objektattributen.</p> 154 </div> 155 </div> 156 157 <div class="php8-compare"> 158 <h2 class="php8-h2" id="union-types"> 159 Union Types 160 <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> <a class="php8-rfc" href="/manual/de/language.types.declarations.php#language.types.declarations.union">Doc</a> 161 </h2> 162 <div class="php8-compare__main"> 163 <div class="php8-compare__block example-contents"> 164 <div class="php8-compare__label">PHP 7</div> 165 <div class="php8-code phpcode"> 166 <?php highlight_php_trimmed( 167 'class Number { 168 /** @var int|float */ 169 private $number; 170 171 /** 172 * @param float|int $number 173 */ 174 public function __construct($number) { 175 $this->number = $number; 176 } 177} 178 179new Number(\'NaN\'); // Ok', 180 );?> 181 </div> 182 </div> 183 <div class="php8-compare__arrow"></div> 184 <div class="php8-compare__block example-contents"> 185 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 186 <div class="php8-code phpcode"> 187 <?php highlight_php_trimmed( 188 'class Number { 189 public function __construct( 190 private int|float $number 191 ) {} 192} 193 194new Number(\'NaN\'); // TypeError', 195 );?> 196 </div> 197 </div> 198 </div> 199 <div class="php8-compare__content"> 200 <p>Anstelle von PHPDoc Annotations für kombinierte Typen kannst du native Union-Type-Deklarationen verwenden, 201 welche zur Laufzeit validiert werden.</p> 202 </div> 203 </div> 204 205 <div class="php8-compare"> 206 <h2 class="php8-h2" id="match-expression"> 207 Match Ausdruck 208 <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> <a class="php8-rfc" href="/manual/de/control-structures.match.php">Doc</a> 209 </h2> 210 <div class="php8-compare__main"> 211 <div class="php8-compare__block example-contents"> 212 <div class="php8-compare__label">PHP 7</div> 213 <div class="php8-code phpcode"> 214 <?php highlight_php_trimmed( 215 'switch (8.0) { 216 case \'8.0\': 217 $result = "Oh nein!"; 218 break; 219 case 8.0: 220 $result = "Das hatte ich erwartet"; 221 break; 222} 223echo $result; 224//> Oh nein!', 225 );?> 226 </div> 227 </div> 228 <div class="php8-compare__arrow"></div> 229 <div class="php8-compare__block example-contents"> 230 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 231 <div class="php8-code phpcode"> 232 <?php highlight_php_trimmed( 233 'echo match (8.0) { 234 \'8.0\' => "Oh nein!", 235 8.0 => "Das hatte ich erwartet", 236}; 237//> Das hatte ich erwartet', 238 );?> 239 </div> 240 </div> 241 </div> 242 <div class="php8-compare__content"> 243 <p>Der neue Match Ausdruck ist ähnlich wie die Switch Anweisung und bietet folgende Funktionen:</p> 244 <ul> 245 <li>Da Match ein Ausdruck ist, kann sein Ergebnis in einer Variable gespeichert oder ausgegeben werden.</li> 246 <li>Match Zweige unterstützen nur einzeilige Ausdrücke und benötigen keinen break; Ausdruck.</li> 247 <li>Match führt strikte Vergleiche durch.</li> 248 </ul> 249 </div> 250 </div> 251 252 <div class="php8-compare"> 253 <h2 class="php8-h2" id="nullsafe-operator"> 254 Nullsafe Operator 255 <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a> 256 </h2> 257 <div class="php8-compare__main"> 258 <div class="php8-compare__block example-contents"> 259 <div class="php8-compare__label">PHP 7</div> 260 <div class="php8-code phpcode"> 261 <?php highlight_php_trimmed( 262 '$country = null; 263 264if ($session !== null) { 265 $user = $session->user; 266 267 if ($user !== null) { 268 $address = $user->getAddress(); 269 270 if ($address !== null) { 271 $country = $address->country; 272 } 273 } 274}', 275 );?> 276 </div> 277 </div> 278 <div class="php8-compare__arrow"></div> 279 <div class="php8-compare__block example-contents"> 280 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 281 <div class="php8-code phpcode"> 282 <?php highlight_php_trimmed( 283 '$country = $session?->user?->getAddress()?->country;', 284 );?> 285 </div> 286 </div> 287 </div> 288 <div class="php8-compare__content"> 289 <p>Anstelle von Null-Checks kannst du Funktionsaufrufe nun direkt mit dem neuen Nullsafe Operator 290 aneinanderreihen. Wenn ein Funktionsaufruf innerhalb der Kette Null zurückliefert, wird die weitere 291 Ausführung abgebrochen und die gesamte Kette wird zu Null ausgewertet.</p> 292 </div> 293 </div> 294 295 <div class="php8-compare"> 296 <h2 class="php8-h2" id="saner-string-to-number-comparisons"> 297 Vernünftige String-zu-Zahl Vergleiche 298 <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a> 299 </h2> 300 <div class="php8-compare__main"> 301 <div class="php8-compare__block example-contents"> 302 <div class="php8-compare__label">PHP 7</div> 303 <div class="php8-code phpcode"> 304 <?php highlight_php_trimmed( 305 '0 == \'foobar\' // true', 306 );?> 307 </div> 308 </div> 309 <div class="php8-compare__arrow"></div> 310 <div class="php8-compare__block example-contents"> 311 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 312 <div class="php8-code phpcode"> 313 <?php highlight_php_trimmed( 314 '0 == \'foobar\' // false', 315 );?> 316 </div> 317 </div> 318 </div> 319 <div class="php8-compare__content"> 320 <p>Wenn eine Zahl mit einem numerischen String verglichen wird, benutzt PHP 8 einen Zahlen-Vergleich. Andernfalls 321 wird die Zahl zu einem String konvertiert und ein String-Vergleich durchgeführt.</p> 322 </div> 323 </div> 324 325 <div class="php8-compare"> 326 <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions"> 327 Konsistente Typen-Fehler für interne Funktionen 328 <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a> 329 </h2> 330 <div class="php8-compare__main"> 331 <div class="php8-compare__block example-contents"> 332 <div class="php8-compare__label">PHP 7</div> 333 <div class="php8-code phpcode"> 334 <?php highlight_php_trimmed( 335 'strlen([]); // Warning: strlen() expects parameter 1 to be string, array given 336 337array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0', 338 );?> 339 </div> 340 </div> 341 <div class="php8-compare__arrow"></div> 342 <div class="php8-compare__block example-contents"> 343 <div class="php8-compare__label php8-compare__label_new">PHP 8</div> 344 <div class="php8-code phpcode"> 345 <?php highlight_php_trimmed( 346 'strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given 347 348array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0', 349 );?> 350 </div> 351 </div> 352 </div> 353 <div class="php8-compare__content"> 354 <p>Die meisten internen Funktionen erzeugen nun eine Error Exception wenn die Typenvalidierung der Parameter 355 fehlschlägt.</p> 356 </div> 357 </div> 358</section> 359 360<section class="php8-section php8-section_light"> 361 <h2 class="php8-h2">Just-In-Time Compiler</h2> 362 <p> 363 PHP 8 führt zwei JIT Compiler Engines ein. Tracing-JIT, der vielversprechendere der beiden, zeigt eine bis zu drei 364 mal bessere Performance in synthetischen Benchmarks und eine 1,5 bis zweifache Verbesserung in einigen speziellen, 365 langlaufenden Anwendungen. Die Performance einer typischen Anwendung ist auf dem Niveau von PHP 7.4. 366 </p> 367 <h3 class="php8-h3"> 368 Relativer Beitrag des JIT Compilers zur Performance von PHP 8 369 </h3> 370 <p> 371 <img src="/images/php8/scheme.svg" width="900" alt="Just-In-Time compilation"> 372 </p> 373 374 <div class="php8-columns"> 375 <div class="php8-column"> 376 <h2 class="php8-h2 php8-h2_margin-top">Verbesserungen am Typen-System und an der Fehlerbehandlung</h2> 377 <ul> 378 <li> 379 Striktere Typen-Checks für arithmetische/bitweise Operatoren 380 <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a> 381 </li> 382 <li> 383 Validierung abstrakter Methoden in einem Trait <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a> 384 </li> 385 <li> 386 Korrekte Signaturen magischer Funktionen <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a> 387 </li> 388 <li> 389 Neue Klassifizierung von Engine-Warnings <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a> 390 </li> 391 <li> 392 Inkompatiblen Methoden-Signaturen erzeugen einen Fatal Error <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a> 393 </li> 394 <li> 395 Der @ Operator unterdrückt keine Fatal Errors mehr. 396 </li> 397 <li> 398 Vererbung mit privaten Methoden <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a> 399 </li> 400 <li> 401 Mixed Typ <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a> 402 </li> 403 <li> 404 Static als Rückgabetyp <a href="https://wiki.php.net/rfc/static_return_type">RFC</a> 405 </li> 406 <li> 407 Typen für interne Funktionen 408 <a href="https://externals.io/message/106522">E-Mail-Thread</a> 409 </li> 410 <li> 411 Objekte ohne Methoden anstelle des resource Typs für 412 <a href="https://php.watch/versions/8.0/resource-CurlHandle">Curl</a>, 413 <a href="https://php.watch/versions/8.0/gdimage">Gd</a>, 414 <a href="https://php.watch/versions/8.0/sockets-sockets-addressinfo">Sockets</a>, 415 <a href="https://php.watch/versions/8.0/OpenSSL-resource">OpenSSL</a>, 416 <a href="https://php.watch/versions/8.0/xmlwriter-resource">XMLWriter</a>, und 417 <a href="https://php.watch/versions/8.0/xmlwriter-resource">XML</a> 418 Extension 419 </li> 420 </ul> 421 </div> 422 <div class="php8-column"> 423 <h2 class="php8-h2 php8-h2_margin-top">Weitere Syntax-Anpassungen und Verbesserungen</h2> 424 <ul> 425 <li> 426 Erlauben eines abschließenden Kommas in Parameter-Listen <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> 427 und Closure Use Listen <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a>. 428 </li> 429 <li> 430 Catches ohne Exception-Variable <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a> 431 </li> 432 <li> 433 Anpassungen an der Syntax für Variablen <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a> 434 </li> 435 <li> 436 Namespaces werden als ein Token ausgewertet <a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a> 437 </li> 438 <li> 439 Throw ist jetzt ein Ausdruck <a href="https://wiki.php.net/rfc/throw_expression">RFC</a> 440 </li> 441 <li> 442 Nutzung von ::class auf Objekten <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a> 443 </li> 444 </ul> 445 446 <h2 class="php8-h2 php8-h2_margin-top">Neue Klassen, Interfaces, und Funktionen</h2> 447 <ul> 448 <li> 449 <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a> Klasse 450 </li> 451 <li> 452 <a href="https://wiki.php.net/rfc/stringable">Stringable</a> Interface 453 </li> 454 <li> 455 <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>, 456 <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>, 457 <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a> 458 </li> 459 <li> 460 <a href="https://github.com/php/php-src/pull/4769">fdiv()</a> 461 </li> 462 <li> 463 <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a> 464 </li> 465 <li> 466 <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a> 467 </li> 468 <li> 469 <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> mit einer Objekt-Implementierung 470 </li> 471 <li> 472 <a href="https://wiki.php.net/rfc/dom_living_standard_api">Neue APIs für DOM-Traversal and -Manipulation</a> 473 </li> 474 </ul> 475 </div> 476 </div> 477</section> 478 479<section class="php8-section php8-section_dark php8-section_footer php8-footer"> 480 <div class="php8-section__content"> 481 <h2 class="php8-h2 center"> 482 Bessere Performance, bessere Syntax, optimierte Typsicherheit. 483 </h2> 484 <div class="php8-button-wrapper center"> 485 <a class="php8-button php8-button_light" href="/downloads">Wechsle jetzt zu PHP 8!</a> 486 </div> 487 <div class="php8-footer__content"> 488 <p> 489 Für den direkten Code-Download von PHP 8 schaue bitte auf der <a href="http://www.php.net/downloads">Downloads</a> Seite vorbei. 490 Windows Pakete können auf der <a href="http://windows.php.net/download">PHP für Windows</a> Seite gefunden werden. 491 Die Liste der Änderungen ist im <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a> festgehalten. 492 </p> 493 <p> 494 Der <a href="/manual/de/migration80.php">Migration Guide</a> ist im PHP Manual verfügbar. Lies dort 495 nach für detaillierte Informationen zu den neuen Funktionen und inkompatiblen Änderungen zu vorherigen PHP 496 Versionen. 497 </p> 498 </div> 499 </div> 500</section> 501 502 503 504 505<?php site_footer(); 506