xref: /web-php/releases/8.0/de.php (revision c093fb53)
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