com web/php: Move php8 pages into releases/8.0 and use 'php8' for config tag: include/header.inc releases/8.0/de.php releases/8.0/en.php
releases/8.0/index.php releases/8.0/pt_BR.php relea ses/8.0/ru.php releases/8_0_x.php release s/8_0_x_de.php releases/8_0_x_pt_BR .php
releases/8_0_x_ru.php

From: Date: Wed, 25 Nov 2020 20:49:48 +0000
Subject: com web/php: Move php8 pages into releases/8.0 and use 'php8' for config tag: include/header.inc releases/8.0/de.php releases/8.0/en.php
releases/8.0/index.php releases/8.0/pt_BR.php relea ses/8.0/ru.php releases/8_0_x.php release s/8_0_x_de.php releases/8_0_x_pt_BR .php
releases/8_0_x_ru.php
Groups: php.webmaster 
Request: Send a blank email to php-webmaster+get-28889@lists.php.net to get a copy of this message
Commit: ac83fe2e4e3f1cca6d54ac35d7452c565a0ad031 Author: Sara Golemon <pollita@php.net> Wed, 25 Nov 2020 20:49:48 +0000 Parents: bf8ae9d5a3762d64b8362b8015fa52b3d62b954b Branches: master Link: http://git.php.net/?p=web/php.git;a=commitdiff;h=ac83fe2e4e3f1cca6d54ac35d7452c565a0ad031 Log: Move php8 pages into releases/8.0 and use 'php8' for config tag Changed paths: M include/header.inc A releases/8.0/de.php A releases/8.0/en.php A releases/8.0/index.php A releases/8.0/pt_BR.php A releases/8.0/ru.php D releases/8_0_x.php D releases/8_0_x_de.php D releases/8_0_x_pt_BR.php D releases/8_0_x_ru.php

diff --git a/include/header.inc b/include/header.inc index b40632857..9f21bb67a 100644 --- a/include/header.inc +++ b/include/header.inc @@ -121,8 +121,8 @@ if (!isset($config["languages"])) { <li class="<?php echo $curr == "community" ? "active" : ""?>"><a href="/get-involved" >Get Involved</a></li> <li class="<?php echo $curr == "help" ? "active" : ""?>"><a href="/support">Help</a></li> <?php if (!empty($GLOBALS['RELEASES'][8])): ?> - <li class="<?php echo false !== strpos($curr, "php_8_0_x") ? "active" : "" ?>"> - <a href="/releases/8_0_x.php"> + <li class="<?php echo $curr === "php8" ? "active" : "" ?>"> + <a href="/releases/8.0/index.php"> <img src="/images/php8/logo_php8.svg" alt="php8" height="22" width="60"> </a> </li> diff --git a/releases/8.0/de.php b/releases/8.0/de.php new file mode 100644 index 000000000..488299c8d --- /dev/null +++ b/releases/8.0/de.php @@ -0,0 +1,501 @@ +<?php +$_SERVER['BASE_PAGE'] = 'releases/8.0/de.php'; +include_once __DIR__ . '/../../include/prepend.inc'; + +if ($LANG === 'en') { + mirror_redirect('/releases/8.0/en.php?lang=en'); +} + +if (($LANG !== 'de') && file_exists(__DIR__ . basename($LANG) . '.php')) { + mirror_redirect('/releases/8.0/' . urlencode($LANG) . '.php?lang=' . urlencode($LANG)); +} + +site_header("PHP 8.0.0 Release Announcement", array( + "current" => "php8", + 'css' => array('php8.css'), + 'meta_tags' => array( + 'og:image' => $MYSITE . 'images/php8/php_8_released.png' + ) +)); +?> +<section class="php8-section php8-section_dark php8-section_header center"> + <div class="page-tools"> + <div class="change-language"> + <?php echo release_language_chooser($LANG); ?> + </div> + </div> + <div class="php8-section__content"> + <div class="php8-logo"> + <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343"> + </div> + <div class="php8-title">Released!</div> + <div class="php8-subtitle"> + PHP 8.0 ist ein Major-Update der Sprache PHP.<br class="display-none-md"> Es beinhaltet viele neue Funktionen + und Optimierungen wie beispielsweise Named Arguments, Union Types, Attribute, Constructor Property Promotion, + Match Ausdrücke, Nullsafe Operator, JIT und Verbesserungen des Typen-Systems, der Fehlerbehandlung und der + Konsistenz. + </div> + <div class="php8-button-wrapper center"> + <a class="php8-button php8-button_light" href="/downloads">Wechsle jetzt zu PHP 8!</a> + </div> + </div> +</section> + +<section class="php8-section center"> + <div class="php8-compare"> + <h2 class="php8-h2" id="named-arguments"> + Named Arguments + <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'htmlspecialchars($string, double_encode: false);' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <ul> + <li>Gib nur notwendige Parameter an, überspringe optionale.</li> + <li>Parameter sind unabhängig von der Reihenfolge und selbstdokumentierend.</li> + </ul> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="attributes"> + Attribute + <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '/** +* @Route("/api/posts/{id}", methods={"GET", "HEAD"}) +*/ +class User +{' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '#[Route("/api/posts/{id}", methods: ["GET", "HEAD"])] +class User +{' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Anstelle von PHPDoc Annotations kannst du nun struktirierte Meta-Daten in nativer PHP Syntax nutzen.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="constructor-property-promotion"> + Constructor Property Promotion + <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '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; + } +}' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'class Point { + public function __construct( + public float $x = 0.0, + public float $y = 0.0, + public float $z = 0.0, + ) {} +}' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Weniger Codewiederholungen für das Definieren und Initialisieren von Objektattributen.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="union-types"> + Union Types + <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> <a class="php8-rfc" href="/manual/en/language.types.declarations.php#language.types.declarations.union">Doc</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'class Number { + /** @var int|float */ + private $number; + + /** + * @param float|int $number + */ + public function __construct($number) { + $this->number = $number; + } +} + +new Number(\'NaN\'); // Ok' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'class Number { + public function __construct( + private int|float $number + ) {} +} + +new Number(\'NaN\'); // TypeError' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Anstelle von PHPDoc Annotations für kombinierte Typen kannst du native Union-Type-Deklarationen verwenden, + welche zur Laufzeit validiert werden.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="match-expression"> + Match Ausdruck + <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'switch (8.0) { + case \'8.0\': + $result = "Oh no!"; + break; + case 8.0: + $result = "This is what I expected"; + break; +} +echo $result; +//> Oh no!' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'echo match (8.0) { +\'8.0\' => "Oh no!", +8.0 => "This is what I expected", +}; +//> This is what I expected' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Der neue Match Ausdruck ist ähnlich wie die Switch Anweisung und bietet folgende Funktionen:</p> + <ul> + <li>Match ist ein Ausruck. Das heißt, das Ergebnis kann in einer Variable gespeichert werden oder zurückgegeben + werden.</li> + <li>Match Zweige unterstützen nur einzeilige Ausdrücke und benötigen keinen break; Ausdruck.</li> + <li>Match führt strikte Vergleiche durch.</li> + </ul> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="nullsafe-operator"> + Nullsafe Operator + <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '$country = null; + +if ($session !== null) { + $user = $session->user; + + if ($user !== null) { + $address = $user->getAddress(); + + if ($address !== null) { + $country = $address->country; + } + } +}' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '$country = $session?->user?->getAddress()?->country;' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Anstelle von Null-Checks kannst du Funktionsaufrufe nun direkt mit dem neuen Nullsafe Operator + aneinanderreihen. Wenn ein Funktionsaufruf innerhalb der Kette Null zurückliefert, wird die weitere + Ausführung abgebrochen und die gesamte Kette wird zu Null ausgewertet.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="saner-string-to-number-comparisons"> + Vernünftige String-zu-Zahl Vergleiche + <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '0 == \'foobar\' // true' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '0 == \'foobar\' // false' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Wenn eine Zahl mit einem numerischen String verglichen wird, benutzt PHP 8 einen Zahlen-Vergleich. Andernfalls + wird die Zahl zu einem String konvertiert und ein String-Vergleich durchgeführt.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions"> + Konsistente Typen-Fehler für interne Funktionen + <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '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' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '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' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Die meisten internen Funktionen erzeugen nun eine Fatal Error Exception wenn die Typenvalidierung der Parameter + fehlschlägt.</p> + </div> + </div> +</section> + +<section class="php8-section php8-section_light"> + <h2 class="php8-h2">Just-In-Time Compiler</h2> + <p> + PHP 8 führt zwei JIT Compiler Engines ein. Tracing-JIT, der vielversprechendere der beiden, zeigt eine bis zu drei + mal bessere Performance in synthetischen Benchmarks und eine 1,5 bis zweifache Verbesserung in einigen speziellen, + langlaufenden Anwendungen. Die Performance einer typischen Anwendung ist auf dem Niveau von PHP 7.4. + </p> + <h3 class="php8-h3"> + Relativer Beitrag des JIT Compilers zur Performance von PHP 8 + </h3> + <p> + <img src="/images/php8/scheme.svg" width="900" alt="Just-In-Time compilation"> + </p> + + <div class="php8-columns"> + <div class="php8-column"> + <h2 class="php8-h2 php8-h2_margin-top">Verbesserungen am Typen-System und an der Fehlerbehandlung</h2> + <ul> + <li> + Striktere Typen-Checks für arithmetische/bitweise Operatoren + <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a> + </li> + <li> + Validierung abstrakter Methoden in einem Trait <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a> + </li> + <li> + Korrekte Signaturen magischer Funktionen <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a> + </li> + <li> + Neue Klassifizierung von Engine-Warnings <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a> + </li> + <li> + Inkompatiblen Methoden-Signaturen erzeugen einen Fatal Error <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a> + </li> + <li> + Der @ Operator unterdrückt keine Fatal Errors mehr. + </li> + <li> + Vererbung mit privaten Methoden <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a> + </li> + <li> + Mixed Typ <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a> + </li> + <li> + Static als Rückgabetyp <a href="https://wiki.php.net/rfc/static_return_type">RFC</a> + </li> + <li> + Typen für interne Funktionen + <a href="https://externals.io/message/106522">RFC</a> + </li> + <li> + Curl verwendet nun Objekte anstelle des resource Typs + <a href="https://php.watch/versions/8.0/resource-CurlHandle">RFC</a> + </li> + </ul> + </div> + <div class="php8-column"> + <h2 class="php8-h2 php8-h2_margin-top">Weitere Syntax-Anpassungen und Verbesserungen</h2> + <ul> + <li> + Erlauben eines Abschließenden Kommas in Parameter-Listen <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> + und Closure Use Listen <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a>. + </li> + <li> + Catches ohne Exception-Variable <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a> + </li> + <li> + Anpassungen an der Syntax für Variablen <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a> + </li> + <li> + Namespaces werden als ein Token ausgewertet <a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a> + </li> + <li> + Throw ist jetzt ein Ausdruck <a href="https://wiki.php.net/rfc/throw_expression">RFC</a> + </li> + <li> + Nutzung von ::class auf Objekten <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a> + </li> + </ul> + + <h2 class="php8-h2 php8-h2_margin-top">Neue Klassen, Interfaces, und Funktionen</h2> + <ul> + <li> + <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a> Klasse + </li> + <li> + <a href="https://wiki.php.net/rfc/stringable">Stringable</a> Interface + </li> + <li> + <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>, + <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>, + <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a> + </li> + <li> + <a href="https://github.com/php/php-src/pull/4769">fdiv()</a> + </li> + <li> + <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a> + </li> + <li> + <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a> + </li> + <li> + <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> mit einer Objekt-Implementierung + </li> + </ul> + </div> + </div> +</section> + +<section class="php8-section php8-section_dark php8-section_footer php8-footer"> + <div class="php8-section__content"> + <h2 class="php8-h2 center"> + Bessere Performance, bessere Syntax, optimierte Typsicherheit. + </h2> + <div class="php8-button-wrapper center"> + <a class="php8-button php8-button_light" href="/downloads">Wechsle jetzt zu PHP 8!</a> + </div> + <div class="php8-footer__content"> + <p> + Für den direkten Code-Download von PHP 8 schaue bitte auf der <a href="http://www.php.net/downloads">Downloads</a> Seite vorbei. + Windows Pakete können auf der <a href="http://windows.php.net/download">PHP for Windows</a> Seite gefunden werden. + Die Liste der Änderungen ist im <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a> festgehalten. + </p> + <p> + Der <a href="/manual/de/migration80.php">Migration Guide</a> ist im PHP Manual verfügbar. Lies dort + nach für detaillierte Informationen zu den neuen Funktionen und inkompatiblen Änderungen zu vorherigen PHP + Versionen. + </p> + </div> + </div> +</section> + + + + +<?php site_footer(); diff --git a/releases/8.0/en.php b/releases/8.0/en.php new file mode 100644 index 000000000..eb92fb7c2 --- /dev/null +++ b/releases/8.0/en.php @@ -0,0 +1,495 @@ +<?php +$_SERVER['BASE_PAGE'] = 'releases/8.0/en.php'; +include_once __DIR__ . '/../../include/prepend.inc'; + +if (($LANG !== 'en') && file_exists(__DIR__ . basename($LANG) . '.php')) { + mirror_redirect('/releases/8.0/' . urlencode($LANG) . '.php?lang=' . urlencode($LANG)); +} + +site_header("PHP 8.0.0 Release Announcement", array( + "current" => "php8", + 'css' => array('php8.css'), + 'meta_tags' => array( + 'og:image' => $MYSITE . 'images/php8/php_8_released.png' + ) +)); +?> +<section class="php8-section php8-section_dark php8-section_header center"> + <div class="page-tools"> + <div class="change-language"> + <?php echo release_language_chooser($LANG); ?> + </div> + </div> + <div class="php8-section__content"> + <div class="php8-logo"> + <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343"> + </div> + <div class="php8-title">released!</div> + <div class="php8-subtitle"> + PHP 8.0 is a major update of the PHP language.<br class="display-none-md"> It contains many new features and + optimizations including named arguments, union types, attributes, constructor property promotion, match + expression, nullsafe operator, JIT, and improvements in the type system, error handling, and consistency. + </div> + <div class="php8-button-wrapper center"> + <a class="php8-button php8-button_light" href="/downloads">Go update to PHP 8!</a> + </div> + </div> +</section> + +<section class="php8-section center"> + <div class="php8-compare"> + <h2 class="php8-h2" id="named-arguments"> + Named arguments + <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);' + );?> + </div> + + + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'htmlspecialchars($string, double_encode: false);' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <ul> + <li>Specify only required parameters, skipping optional ones.</li> + <li>Arguments are order-independent and self-documented.</li> + </ul> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="attributes"> + Attributes + <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '/** +* @Route("/api/posts/{id}", methods={"GET", "HEAD"}) +*/ +class User +{' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '#[Route("/api/posts/{id}", methods: ["GET", "HEAD"])] +class User +{' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Instead of PHPDoc annotations, you can now use structured metadata with PHP's native syntax.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="constructor-property-promotion"> + Constructor property promotion + <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '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; + } +}' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'class Point { + public function __construct( + public float $x = 0.0, + public float $y = 0.0, + public float $z = 0.0, + ) {} +}' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Less boilerplate code to define and initialize properties.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="union-types"> + Union types + <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> <a class="php8-rfc" href="/manual/en/language.types.declarations.php#language.types.declarations.union">Doc</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'class Number { + /** @var int|float */ + private $number; + + /** + * @param float|int $number + */ + public function __construct($number) { + $this->number = $number; + } +} + +new Number(\'NaN\'); // Ok' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'class Number { + public function __construct( + private int|float $number + ) {} +} + +new Number(\'NaN\'); // TypeError' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Instead of PHPDoc annotations for a combination of types, you can use native union type declarations that are + validated at runtime.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="match-expression"> + Match expression + <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'switch (8.0) { + case \'8.0\': + $result = "Oh no!"; + break; + case 8.0: + $result = "This is what I expected"; + break; +} +echo $result; +//> Oh no!' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'echo match (8.0) { + \'8.0\' => "Oh no!", + 8.0 => "This is what I expected", +}; +//> This is what I expected' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>The new match is similar to switch and has the following features:</p> + <ul> + <li>Match is an expression, meaning its result can be stored in a variable or returned.</li> + <li>Match branches only support single-line expressions and do not need a break; statement.</li> + <li>Match does strict comparisons.</li> + </ul> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="nullsafe-operator"> + Nullsafe operator + <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '$country = null; + +if ($session !== null) { + $user = $session->user; + + if ($user !== null) { + $address = $user->getAddress(); + + if ($address !== null) { + $country = $address->country; + } + } +}' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '$country = $session?->user?->getAddress()?->country;' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Instead of null check conditions, you can now use a chain of calls with the new nullsafe operator. When the + evaluation of one element in the chain fails, the execution of the entire chain aborts and the entire chain + evaluates to null.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="saner-string-to-number-comparisons"> + Saner string to number comparisons + <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '0 == \'foobar\' // true' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '0 == \'foobar\' // false' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>When comparing to a numeric string, PHP 8 uses a number comparison. Otherwise, it converts the number to a + string and uses a string comparison.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions"> + Consistent type errors for internal functions + <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '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' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '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' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Most of the internal functions now throw a Fatal Error exception if the validation of the parameters fails.</p> + </div> + </div> +</section> + +<section class="php8-section php8-section_light"> + <h2 class="php8-h2">Just-In-Time compilation</h2> + <p> + PHP 8 introduces two JIT compilation engines. Tracing JIT, the most promising of the two, shows about 3 times better + performance on synthetic benchmarks and 1.5–2 times improvement on some specific long-running applications. Typical + application performance is on par with PHP 7.4. + </p> + <h3 class="php8-h3"> + Relative JIT contribution to PHP 8 performance + </h3> + <p> + <img src="/images/php8/scheme.svg" width="900" alt="Just-In-Time compilation"> + </p> + + <div class="php8-columns"> + <div class="php8-column"> + <h2 class="php8-h2 php8-h2_margin-top">Type system and error handling improvements</h2> + <ul> + <li> + Stricter type checks for arithmetic/bitwise operators + <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a> + </li> + <li> + Abstract trait method validation <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a> + </li> + <li> + Correct signatures of magic methods <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a> + </li> + <li> + Reclassified engine warnings <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a> + </li> + <li> + Fatal error for incompatible method signatures <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a> + </li> + <li> + The @ operator no longer silences fatal errors. + </li> + <li> + Inheritance with private methods <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a> + </li> + <li> + Mixed type <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a> + </li> + <li> + Static return type <a href="https://wiki.php.net/rfc/static_return_type">RFC</a> + </li> + <li> + Types for internal functions + <a href="https://externals.io/message/106522">RFC</a> + </li> + <li> + Curl objects instead of resources + <a href="https://php.watch/versions/8.0/resource-CurlHandle">RFC</a> + </li> + </ul> + </div> + <div class="php8-column"> + <h2 class="php8-h2 php8-h2_margin-top">Other syntax tweaks and improvements</h2> + <ul> + <li> + Allow a trailing comma in parameter lists <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> + and closure use lists <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a> + </li> + <li> + Non-capturing catches <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a> + </li> + <li> + Variable Syntax Tweaks <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a> + </li> + <li> + Treat namespaced names as single token <a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a> + </li> + <li> + Throw is now an expression <a href="https://wiki.php.net/rfc/throw_expression">RFC</a> + </li> + <li> + Allow ::class on objects <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a> + </li> + </ul> + + <h2 class="php8-h2 php8-h2_margin-top">New Classes, Interfaces, and Functions</h2> + <ul> + <li> + <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a> class + </li> + <li> + <a href="https://wiki.php.net/rfc/stringable">Stringable</a> interface + </li> + <li> + <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>, + <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>, + <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a> + </li> + <li> + <a href="https://github.com/php/php-src/pull/4769">fdiv()</a> + </li> + <li> + <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a> + </li> + <li> + <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a> + </li> + <li> + <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> object implementation + </li> + </ul> + </div> + </div> +</section> + +<section class="php8-section php8-section_dark php8-section_footer php8-footer"> + <div class="php8-section__content"> + <h2 class="php8-h2 center"> + Better performance, better syntax, improved type safety. + </h2> + <div class="php8-button-wrapper center"> + <a class="php8-button php8-button_light" href="/downloads">Go update to PHP 8!</a> + </div> + <div class="php8-footer__content"> + <p> + For source downloads of PHP 8 please visit the <a href="http://www.php.net/downloads">downloads</a> page. + Windows binaries can be found on the <a href="http://windows.php.net/download">PHP for Windows</a> site. + The list of changes is recorded in the <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a>. + </p> + <p> + The <a href="/manual/en/migration80.php">migration guide</a> is available in the PHP Manual. Please + consult it for a detailed list of new features and backward-incompatible changes. + </p> + </div> + </div> +</section> + + + + +<?php site_footer(); diff --git a/releases/8.0/index.php b/releases/8.0/index.php new file mode 100644 index 000000000..9309e102c --- /dev/null +++ b/releases/8.0/index.php @@ -0,0 +1,5 @@ +<?php + $_SERVER['BASE_PAGE'] = 'releases/8.0/index.php'; +include(__DIR__ . '/../../include/site.inc'); + +mirror_redirect('/releases/8.0/en.php'); diff --git a/releases/8.0/pt_BR.php b/releases/8.0/pt_BR.php new file mode 100644 index 000000000..9150da282 --- /dev/null +++ b/releases/8.0/pt_BR.php @@ -0,0 +1,502 @@ +<?php +$_SERVER['BASE_PAGE'] = 'releases/8.0/pt_BR.php'; +include_once __DIR__ . '/../../include/prepend.inc'; + +if ($LANG === 'en') { + mirror_redirect('/releases/8.0/en.php?lang=en'); +} + +if (($LANG !== 'pt_BR') && file_exists(__DIR__ . basename($LANG) . '.php')) { + mirror_redirect('/releases/8.0/' . urlencode($LANG) . '.php?lang=' . urlencode($LANG)); +} + +site_header("PHP 8.0.0 Release Announcement", array( + "current" => "php8", + 'css' => array('php8.css'), + 'meta_tags' => array( + 'og:image' => $MYSITE . 'images/php8/php_8_released.png' + ) +)); +?> + <section class="php8-section php8-section_dark php8-section_header center"> + <div class="page-tools"> + <div class="change-language"> + <?php echo release_language_chooser($LANG); ?> + </div> + </div> + <div class="php8-section__content"> + <div class="php8-logo"> + <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343"> + </div> + <div class="php8-title">released!</div> + <div class="php8-subtitle"> + PHP 8.0 é uma atualização importante da linguagem PHP. <br class="display-none-md"> Ela contém muitos novos + recursos e otimizações, incluindo argumentos nomeados, união de tipos, atributos, promoção de propriedade do + construtor, expressão match, operador nullsafe, JIT e melhorias no sistema de tipos, tratamento de + erros e consistência. + </div> + <div class="php8-button-wrapper center"> + <a class="php8-button php8-button_light" href="/downloads">Atualize para o PHP 8!</a> + </div> + </div> + </section> + + <section class="php8-section center"> + <div class="php8-compare"> + <h2 class="php8-h2" id="named-arguments"> + Argumentos nomeados + <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'htmlspecialchars($string, double_encode: false);' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <ul> + <li>Especifique apenas os parâmetros obrigatórios, pulando os opcionais.</li> + <li>Os argumentos são independentes da ordem e autodocumentados.</li> + </ul> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="attributes"> + Atributos + <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '/** +* @Route("/api/posts/{id}", methods={"GET", "HEAD"}) +*/ +class User +{' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '#[Route("/api/posts/{id}", methods: ["GET", "HEAD"])] +class User +{' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Em vez de anotações PHPDoc, agora você pode usar metadados estruturados com a sintaxe nativa do PHP.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="constructor-property-promotion"> + Promoção de propriedade de construtor + <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '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; + } +}' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'class Point { + public function __construct( + public float $x = 0.0, + public float $y = 0.0, + public float $z = 0.0, + ) {} +}' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Menos código boilerplate para definir e inicializar propriedades.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="union-types"> + União de tipos + <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> <a class="php8-rfc" href="/manual/en/language.types.declarations.php#language.types.declarations.union">Doc</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'class Number { + /** @var int|float */ + private $number; + + /** + * @param float|int $number + */ + public function __construct($number) { + $this->number = $number; + } +} + +new Number(\'NaN\'); // Ok' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'class Number { + public function __construct( + private int|float $number + ) {} +} + +new Number(\'NaN\'); // TypeError' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Em vez de anotações PHPDoc para uma combinação de tipos, você pode usar declarações de união de tipos nativa + que são validados em tempo de execução.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="match-expression"> + Expressão match + <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'switch (8.0) { + case \'8.0\': + $result = "Oh no!"; + break; + case 8.0: + $result = "This is what I expected"; + break; +} +echo $result; +//> Oh no!' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'echo match (8.0) { + \'8.0\' => "Oh no!", + 8.0 => "This is what I expected", +}; +//> This is what I expected' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>A nova expressão match é semelhante ao switch e tem os seguintes recursos:</p> + <ul> + <li>Match é uma expressão, o que significa que seu resultado pode ser armazenado em uma variável ou + retornado.</li> + <li>Match suporta apenas expressões de uma linha e não precisa de uma declaração break;.</li> + <li>Match faz comparações estritas.</li> + </ul> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="nullsafe-operator"> + Operador nullsafe + <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '$country = null; + +if ($session !== null) { + $user = $session->user; + + if ($user !== null) { + $address = $user->getAddress(); + + if ($address !== null) { + $country = $address->country; + } + } +}' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '$country = $session?->user?->getAddress()?->country;' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Em vez de verificar condições nulas, agora você pode usar uma cadeia de chamadas com o novo operador nullsafe. + Quando a avaliação de um elemento da cadeia falha, a execução de toda a cadeia é abortada e toda a cadeia é + avaliada como nula.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="saner-string-to-number-comparisons"> + Comparações mais inteligentes entre strings e números + <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <pre>0 == 'foobar' // true</pre> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <pre>0 == 'foobar' // false</pre> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Ao comparar com uma string numérica, o PHP 8 usa uma comparação numérica. Caso contrário, ele converte o + número em uma string e usa uma comparação de string.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions"> + Erros consistentes para tipos de dados em funções internas + <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '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' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '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' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>A maioria das funções internas agora lançam uma exceção Fatal Error se a validação do parâmetro falhar.</p> + </div> + </div> + </section> + + <section class="php8-section php8-section_light"> + <h2 class="php8-h2">Compilação Just-In-Time</h2> + <p> + PHP 8 apresenta dois motores de compilação JIT. Tracing JIT, o mais promissor dos dois, mostra desempenho cerca de + 3 vezes melhor em benchmarks sintéticos e melhoria de 1,5 a 2 vezes em alguns aplicativos específicos de longa + execução. O desempenho típico das aplicações está no mesmo nível do PHP 7.4. + </p> + <h3 class="php8-h3"> + Relative JIT contribution to PHP 8 performance + </h3> + <p> + <img src="/images/php8/scheme.svg" width="900" alt="Just-In-Time compilation"> + </p> + + <div class="php8-columns"> + <div class="php8-column"> + <h2 class="php8-h2 php8-h2_margin-top">Melhorias no sistema de tipo e tratamento de erros</h2> + <ul> + <li> + Verificações de tipo mais rígidas para operadores aritméticos / bit a bit + <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a> + </li> + <li> + Validação de método abstrato em traits + <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a> + </li> + <li> + Assinaturas corretas de métodos mágicos <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a> + </li> + <li> + Avisos de motor reclassificados <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a> + </li> + <li> + Erro fatal para assinaturas de método incompatíveis <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a> + </li> + <li> + O operador @ não silencia mais os erros fatais. + </li> + <li> + Herança com métodos privados <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a> + </li> + <li> + Tipo mixed <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a> + </li> + <li> + Tipo de retorno static <a href="">RFC</a> + </li> + <li> + Tipagem de funções internas + <a href="https://externals.io/message/106522">RFC</a> + </li> + <li> + Objetos curl em vez de recursos + <a href="https://php.watch/versions/8.0/resource-CurlHandle">RFC</a> + </li> + </ul> + </div> + <div class="php8-column"> + <h2 class="php8-h2 php8-h2_margin-top">Outros ajustes e melhorias de sintaxe</h2> + <ul> + <li> + Permitir vírgula no final da lista de parâmetros + <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> e listas de uso em closures + <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a> + </li> + <li> + Catches sem variável na captura de exceção <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a> + </li> + <li> + Ajustes de sintaxe para variáveis <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a> + </li> + <li> + Tratamento de nomes de namespace como token único + <a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a> + </li> + <li> + Throw como expressão <a href="https://wiki.php.net/rfc/throw_expression">RFC</a> + </li> + <li> + Permitir ::class em objetos <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a> + </li> + </ul> + + <h2 class="php8-h2 php8-h2_margin-top">Novas classes, interfaces e funções</h2> + <ul> + <li> + Classe <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a> + </li> + <li> + Interface <a href="https://wiki.php.net/rfc/stringable">Stringable</a> + </li> + <li> + <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>, + <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>, + <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a> + </li> + <li> + <a href="https://github.com/php/php-src/pull/4769">fdiv()</a> + </li> + <li> + <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a> + </li> + <li> + <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a> + </li> + <li> + <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> implementado com objetos + </li> + </ul> + </div> + </div> + </section> + + <section class="php8-section php8-section_dark php8-section_footer php8-footer"> + <div class="php8-section__content"> + <h2 class="php8-h2 center"> + Obtenha melhoria de desempenho gratuita.<br class="display-none-lg display-block-md"> + Obtenha melhor sintaxe.<br class="display-block-lg display-none-md display-block-sm"> + Obtenha mais segurança de tipos. + </h2> + <div class="php8-button-wrapper center"> + <a class="php8-button php8-button_light" href="/downloads">Atualize para o PHP 8!</a> + </div> + <div class="php8-footer__content"> + <p> + Para downloads do código-fonte do PHP 8, visite a página de + <a href="http://www.php.net/downloads">downloads</a>. + Os binários do Windows podem ser encontrados na página <a href="http://windows.php.net/download">PHP para + Windows</a>. + A lista de mudanças é registrada no <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a>. + </p> + <p> + O <a href="/manual/pt_BR/migration80.php">guia de migração</a> está disponível no Manual do PHP. + Consulte-o para obter uma lista detalhada de novos recursos e alterações incompatíveis com versões anteriores. + </p> + </div> + </div> + </section> + + + + +<?php site_footer(); diff --git a/releases/8.0/ru.php b/releases/8.0/ru.php new file mode 100644 index 000000000..5d5a9a52c --- /dev/null +++ b/releases/8.0/ru.php @@ -0,0 +1,497 @@ +<?php +$_SERVER['BASE_PAGE'] = 'releases/8.0/ru.php'; +include_once __DIR__ . '/../../include/prepend.inc'; + +if ($LANG === 'en') { + mirror_redirect('/releases/8.0/en.php?lang=en'); +} + +if (($LANG !== 'ru') && file_exists(__DIR__ . basename($LANG) . '.php')) { + mirror_redirect('/releases/8.0/' . urlencode($LANG) . '.php?lang=' . urlencode($LANG)); +} + +site_header("PHP 8.0.0, релиз", array( + "current" => "php8", + 'css' => array('php8.css'), + 'meta_tags' => array( + 'og:image' => $MYSITE . 'images/php8/php_8_released.png' + ) +)); +?> +<section class="php8-section php8-section_dark php8-section_header center"> + <div class="page-tools"> + <div class="change-language"> + <?php echo release_language_chooser($LANG); ?> + </div> + </div> + <div class="php8-section__content"> + <div class="php8-logo"> + <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343"> + </div> + <div class="php8-title">релизнут!</div> + <div class="php8-subtitle"> + PHP 8.0 — большое обновление PHP.<br class="display-none-md"> Оно содержит множество новых возможностей и + оптимизаций, включая именованные аргументы, union type, атрибуты, упрощённое определение свойств в конструкторе, выражение match, + оператор nullsafe, JIT и улучшения в системе типов, обработке ошибок и консистентности. + </div> + <div class="php8-button-wrapper center"> + <a class="php8-button php8-button_light" href="/downloads">Переходите на PHP 8!</a> + </div> + </div> +</section> + +<section class="php8-section center"> + <div class="php8-compare"> + <h2 class="php8-h2" id="named-arguments"> + Именованные аргументы + <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'htmlspecialchars($string, double_encode: false);' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <ul> + <li>Указывайте только необходимые параметры, пропускайте необязательные.</li> + <li>Порядок аргументов не важен, аргументы самодокументируемы.</li> + </ul> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="attributes"> + Атрибуты + <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '/** +* @Route("/api/posts/{id}", methods={"GET", "HEAD"}) +*/ +class User +{' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '#[Route("/api/posts/{id}", methods: ["GET", "HEAD"])] +class User +{' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Вместо аннотаций PHPDoc вы можете использовать структурные метаданные с нативным синтаксисом PHP.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="constructor-property-promotion"> + Объявление свойств в конструкторе + <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '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; + } +}' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'class Point { + public function __construct( + public float $x = 0.0, + public float $y = 0.0, + public float $z = 0.0, + ) {} +}' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Меньше шаблонного кода для определения и инициализации свойств.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="union-types"> + Union types + <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> <a class="php8-rfc" href="/manual/ru/language.types.declarations.php#language.types.declarations.union">Doc</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'class Number { + /** @var int|float */ + private $number; + + /** + * @param float|int $number + */ + public function __construct($number) { + $this->number = $number; + } +} + +new Number(\'NaN\'); // Нет ошибки' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'class Number { + public function __construct( + private int|float $number + ) {} +} + +new Number(\'NaN\'); // TypeError' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Вместо аннотаций PHPDoc для объединенных типов вы можете использовать объявления union type, которые + проверяются во время выполнения.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="match-expression"> + Выражение Match + <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'switch (8.0) { + case \'8.0\': + $result = "О нет!"; + break; + case 8.0: + $result = "То, что я и ожидал"; + break; +} +echo $result; +//> О нет!' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + 'echo match (8.0) { + \'8.0\' => "О нет!", + 8.0 => "То, что я и ожидал", +}; +//> То, что я и ожидал' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Новое выражение match похоже на оператор switch со следующими особенностями:</p> + <ul> + <li>Match — это выражение, его результат может быть сохранён в переменной или возвращён.</li> + <li>Условия match поддерживают только однострочные выражения, для которых не требуется управляющая конструкция break;.</li> + <li>Выражение match использует строгое сравнение.</li> + </ul> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="nullsafe-operator"> + Оператор Nullsafe + <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '$country = null; + +if ($session !== null) { + $user = $session->user; + + if ($user !== null) { + $address = $user->getAddress(); + + if ($address !== null) { + $country = $address->country; + } + } +}' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '$country = $session?->user?->getAddress()?->country;' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Вместо проверки на null вы можете использовать последовательность вызовов с новым оператором Nullsafe. Когда + один из элементов в последовательности возвращает null, выполнение прерывается и вся последовательность + возвращает null.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="saner-string-to-number-comparisons"> + Улучшенное сравнение строк и чисел + <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '0 == \'foobar\' // true' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '0 == \'foobar\' // false' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>При сравнении с числовой строкой PHP 8 использует сравнение чисел. В противном случае число преобразуется в + строку и используется сравнение строк.</p> + </div> + </div> + + <div class="php8-compare"> + <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions"> + Ошибки согласованности типов для встроенных функций + <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a> + </h2> + <div class="php8-compare__main"> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label">PHP 7</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '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' + );?> + </div> + </div> + <div class="php8-compare__arrow"></div> + <div class="php8-compare__block example-contents"> + <div class="php8-compare__label php8-compare__label_new">PHP 8</div> + <div class="php8-code phpcode"> + <?php highlight_php_trimmed( + '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' + );?> + </div> + </div> + </div> + <div class="php8-compare__content"> + <p>Большинство внутренних функций теперь выбрасывают исключение Fatal Error, если при проверке параметра возникает ошибка.</p> + </div> + </div> +</section> + +<section class="php8-section php8-section_light"> + <h2 class="php8-h2">Компиляция Just-In-Time</h2> + <p> + PHP 8 представляет два механизма JIT-компиляции. Трассировка JIT, наиболее перспективная из них, на синтетических бенчмарках показывает + улучшение производительности примерно в 3 раза и в 1,5–2 раза на некоторых долго работающих приложениях. Стандартная + производительность приложения находится на одном уровне с PHP 7.4. + </p> + <h3 class="php8-h3"> + Relative JIT contribution to PHP 8 performance + </h3> + <p> + <img src="/images/php8/scheme.svg" width="900" alt="Ккомпиляция Just-In-Time"> + </p> + + <div class="php8-columns"> + <div class="php8-column"> + <h2 class="php8-h2 php8-h2_margin-top">Улучшения в системе типов и обработке ошибок</h2> + <ul> + <li> + Более строгие проверки типов для арифметических/побитовых операторов + <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a> + </li> + <li> + Проверка методов абстрактных трейтов <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a> + </li> + <li> + Правильные сигнатуры магических методов <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a> + </li> + <li> + Реклассификация предупреждений движка <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a> + </li> + <li> + Фатальная ошибка при несовместимости сигнатур методов <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a> + </li> + <li> + Оператор @ больше не подавляет фатальные ошибки. + </li> + <li> + Наследование с private методами <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a> + </li> + <li> + Новый тип mixed <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a> + </li> + <li> + Возвращаемый тип static <a href="https://wiki.php.net/rfc/static_return_type">RFC</a> + </li> + <li> + Типы для стандартных функций + <a href="https://externals.io/message/106522">RFC</a> + </li> + <li> + Объекты вместо ресурсов для cURL + <a href="https://php.watch/versions/8.0/resource-CurlHandle">RFC</a> + </li> + </ul> + </div> + <div class="php8-column"> + <h2 class="php8-h2 php8-h2_margin-top">Прочие улучшения синтаксиса</h2> + <ul> + <li> + Разрешена запятая в конце списка параметров <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> + и в списке use замыканий <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a> + </li> + <li> + Блок catch без указания переменной <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a> + </li> + <li> + Изменения синтаксиса переменных <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a> + </li> + <li> + Имена в пространстве имен рассматриваются как единый токен <a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a> + </li> + <li> + Выражение Throw <a href="https://wiki.php.net/rfc/throw_expression">RFC</a> + </li> + <li> + Добавление ::class для объектов <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a> + </li> + </ul> + + <h2 class="php8-h2 php8-h2_margin-top">Новые классы, интерфейсы и функции</h2> + <ul> + <li> + Класс <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a> + </li> + <li> + Интерфейс <a href="https://wiki.php.net/rfc/stringable">Stringable</a> + </li> + <li> + <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>, + <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>, + <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a> + </li> + <li> + <a href="https://github.com/php/php-src/pull/4769">fdiv()</a> + </li> + <li> + <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a> + </li> + <li> + <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a> + </li> + <li> + Объектно-ориентированная функция <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> + </li> + </ul> + </div> + </div> +</section> + +<section class="php8-section php8-section_dark php8-section_footer php8-footer"> + <div class="php8-section__content"> + <h2 class="php8-h2 center"> + Выше производительность, лучше синтаксис, надежнее система типов. + </h2> + <div class="php8-button-wrapper center"> + <a class="php8-button php8-button_light" href="/downloads">Переходите на PHP 8!</a> + </div> + <div class="php8-footer__content"> + <p> + Для загрузки исходного кода PHP 8 посетите страницу <a href="http://www.php.net/downloads">downloads</a>. + Бинарные файлы Windows находятся на сайте <a href="http://windows.php.net/download">PHP для Windows</a>. + Список изменений представлен в <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a>. + </p> + <p> + <a href="/manual/ru/migration80.php">Руководство по миграции</a> доступно в разделе документации. Пожалуйста, + изучите его для получения подробного списка новых возможностей и обратно несовместимых изменений. + </p> + </div> + </div> +</section> + + + + +<?php site_footer(); diff --git a/releases/8_0_x.php b/releases/8_0_x.php deleted file mode 100644 index bd9e35221..000000000 --- a/releases/8_0_x.php +++ /dev/null @@ -1,495 +0,0 @@ -<?php -$_SERVER['BASE_PAGE'] = 'releases/8_0_x.php'; -include_once __DIR__ . '/../include/prepend.inc'; - -if (($LANG !== 'en') && file_exists(__DIR__ . '/8_0_x_' . basename($LANG) . '.php')) { - mirror_redirect('/releases/8_0_x_' . urlencode($LANG) . '.php?lang=' . urlencode($LANG)); -} - -site_header("PHP 8.0.0 Release Announcement", array( - "current" => "php_8_0_x", - 'css' => array('php8.css'), - 'meta_tags' => array( - 'og:image' => $MYSITE . 'images/php8/php_8_released.png' - ) -)); -?> -<section class="php8-section php8-section_dark php8-section_header center"> - <div class="page-tools"> - <div class="change-language"> - <?php echo release_language_chooser($LANG); ?> - </div> - </div> - <div class="php8-section__content"> - <div class="php8-logo"> - <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343"> - </div> - <div class="php8-title">released!</div> - <div class="php8-subtitle"> - PHP 8.0 is a major update of the PHP language.<br class="display-none-md"> It contains many new features and - optimizations including named arguments, union types, attributes, constructor property promotion, match - expression, nullsafe operator, JIT, and improvements in the type system, error handling, and consistency. - </div> - <div class="php8-button-wrapper center"> - <a class="php8-button php8-button_light" href="/downloads">Go update to PHP 8!</a> - </div> - </div> -</section> - -<section class="php8-section center"> - <div class="php8-compare"> - <h2 class="php8-h2" id="named-arguments"> - Named arguments - <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);' - );?> - </div> - - - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'htmlspecialchars($string, double_encode: false);' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <ul> - <li>Specify only required parameters, skipping optional ones.</li> - <li>Arguments are order-independent and self-documented.</li> - </ul> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="attributes"> - Attributes - <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '/** -* @Route("/api/posts/{id}", methods={"GET", "HEAD"}) -*/ -class User -{' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '#[Route("/api/posts/{id}", methods: ["GET", "HEAD"])] -class User -{' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Instead of PHPDoc annotations, you can now use structured metadata with PHP's native syntax.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="constructor-property-promotion"> - Constructor property promotion - <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '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; - } -}' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'class Point { - public function __construct( - public float $x = 0.0, - public float $y = 0.0, - public float $z = 0.0, - ) {} -}' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Less boilerplate code to define and initialize properties.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="union-types"> - Union types - <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> <a class="php8-rfc" href="/manual/en/language.types.declarations.php#language.types.declarations.union">Doc</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'class Number { - /** @var int|float */ - private $number; - - /** - * @param float|int $number - */ - public function __construct($number) { - $this->number = $number; - } -} - -new Number(\'NaN\'); // Ok' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'class Number { - public function __construct( - private int|float $number - ) {} -} - -new Number(\'NaN\'); // TypeError' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Instead of PHPDoc annotations for a combination of types, you can use native union type declarations that are - validated at runtime.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="match-expression"> - Match expression - <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'switch (8.0) { - case \'8.0\': - $result = "Oh no!"; - break; - case 8.0: - $result = "This is what I expected"; - break; -} -echo $result; -//> Oh no!' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'echo match (8.0) { - \'8.0\' => "Oh no!", - 8.0 => "This is what I expected", -}; -//> This is what I expected' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>The new match is similar to switch and has the following features:</p> - <ul> - <li>Match is an expression, meaning its result can be stored in a variable or returned.</li> - <li>Match branches only support single-line expressions and do not need a break; statement.</li> - <li>Match does strict comparisons.</li> - </ul> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="nullsafe-operator"> - Nullsafe operator - <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '$country = null; - -if ($session !== null) { - $user = $session->user; - - if ($user !== null) { - $address = $user->getAddress(); - - if ($address !== null) { - $country = $address->country; - } - } -}' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '$country = $session?->user?->getAddress()?->country;' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Instead of null check conditions, you can now use a chain of calls with the new nullsafe operator. When the - evaluation of one element in the chain fails, the execution of the entire chain aborts and the entire chain - evaluates to null.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="saner-string-to-number-comparisons"> - Saner string to number comparisons - <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '0 == \'foobar\' // true' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '0 == \'foobar\' // false' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>When comparing to a numeric string, PHP 8 uses a number comparison. Otherwise, it converts the number to a - string and uses a string comparison.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions"> - Consistent type errors for internal functions - <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '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' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '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' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Most of the internal functions now throw a Fatal Error exception if the validation of the parameters fails.</p> - </div> - </div> -</section> - -<section class="php8-section php8-section_light"> - <h2 class="php8-h2">Just-In-Time compilation</h2> - <p> - PHP 8 introduces two JIT compilation engines. Tracing JIT, the most promising of the two, shows about 3 times better - performance on synthetic benchmarks and 1.5–2 times improvement on some specific long-running applications. Typical - application performance is on par with PHP 7.4. - </p> - <h3 class="php8-h3"> - Relative JIT contribution to PHP 8 performance - </h3> - <p> - <img src="/images/php8/scheme.svg" width="900" alt="Just-In-Time compilation"> - </p> - - <div class="php8-columns"> - <div class="php8-column"> - <h2 class="php8-h2 php8-h2_margin-top">Type system and error handling improvements</h2> - <ul> - <li> - Stricter type checks for arithmetic/bitwise operators - <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a> - </li> - <li> - Abstract trait method validation <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a> - </li> - <li> - Correct signatures of magic methods <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a> - </li> - <li> - Reclassified engine warnings <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a> - </li> - <li> - Fatal error for incompatible method signatures <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a> - </li> - <li> - The @ operator no longer silences fatal errors. - </li> - <li> - Inheritance with private methods <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a> - </li> - <li> - Mixed type <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a> - </li> - <li> - Static return type <a href="https://wiki.php.net/rfc/static_return_type">RFC</a> - </li> - <li> - Types for internal functions - <a href="https://externals.io/message/106522">RFC</a> - </li> - <li> - Curl objects instead of resources - <a href="https://php.watch/versions/8.0/resource-CurlHandle">RFC</a> - </li> - </ul> - </div> - <div class="php8-column"> - <h2 class="php8-h2 php8-h2_margin-top">Other syntax tweaks and improvements</h2> - <ul> - <li> - Allow a trailing comma in parameter lists <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> - and closure use lists <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a> - </li> - <li> - Non-capturing catches <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a> - </li> - <li> - Variable Syntax Tweaks <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a> - </li> - <li> - Treat namespaced names as single token <a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a> - </li> - <li> - Throw is now an expression <a href="https://wiki.php.net/rfc/throw_expression">RFC</a> - </li> - <li> - Allow ::class on objects <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a> - </li> - </ul> - - <h2 class="php8-h2 php8-h2_margin-top">New Classes, Interfaces, and Functions</h2> - <ul> - <li> - <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a> class - </li> - <li> - <a href="https://wiki.php.net/rfc/stringable">Stringable</a> interface - </li> - <li> - <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>, - <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>, - <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a> - </li> - <li> - <a href="https://github.com/php/php-src/pull/4769">fdiv()</a> - </li> - <li> - <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a> - </li> - <li> - <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a> - </li> - <li> - <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> object implementation - </li> - </ul> - </div> - </div> -</section> - -<section class="php8-section php8-section_dark php8-section_footer php8-footer"> - <div class="php8-section__content"> - <h2 class="php8-h2 center"> - Better performance, better syntax, improved type safety. - </h2> - <div class="php8-button-wrapper center"> - <a class="php8-button php8-button_light" href="/downloads">Go update to PHP 8!</a> - </div> - <div class="php8-footer__content"> - <p> - For source downloads of PHP 8 please visit the <a href="http://www.php.net/downloads">downloads</a> page. - Windows binaries can be found on the <a href="http://windows.php.net/download">PHP for Windows</a> site. - The list of changes is recorded in the <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a>. - </p> - <p> - The <a href="/manual/en/migration80.php">migration guide</a> is available in the PHP Manual. Please - consult it for a detailed list of new features and backward-incompatible changes. - </p> - </div> - </div> -</section> - - - - -<?php site_footer(); diff --git a/releases/8_0_x_de.php b/releases/8_0_x_de.php deleted file mode 100644 index b153e2c08..000000000 --- a/releases/8_0_x_de.php +++ /dev/null @@ -1,501 +0,0 @@ -<?php -$_SERVER['BASE_PAGE'] = 'releases/8_0_x_de.php'; -include_once __DIR__ . '/../include/prepend.inc'; - -if ($LANG === 'en') { - mirror_redirect('/releases/8_0_x.php?lang=' . urlencode($LANG)); -} - -if (($LANG !== 'de') && file_exists(__DIR__ . '/8_0_x_' . basename($LANG) . '.php')) { - mirror_redirect('/releases/8_0_x_' . urlencode($LANG) . '.php?lang=' . urlencode($LANG)); -} - -site_header("PHP 8.0.0 Release Announcement", array( - "current" => "php_8_0_x_de", - 'css' => array('php8.css'), - 'meta_tags' => array( - 'og:image' => $MYSITE . 'images/php8/php_8_released.png' - ) -)); -?> -<section class="php8-section php8-section_dark php8-section_header center"> - <div class="page-tools"> - <div class="change-language"> - <?php echo release_language_chooser($LANG); ?> - </div> - </div> - <div class="php8-section__content"> - <div class="php8-logo"> - <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343"> - </div> - <div class="php8-title">Released!</div> - <div class="php8-subtitle"> - PHP 8.0 ist ein Major-Update der Sprache PHP.<br class="display-none-md"> Es beinhaltet viele neue Funktionen - und Optimierungen wie beispielsweise Named Arguments, Union Types, Attribute, Constructor Property Promotion, - Match Ausdrücke, Nullsafe Operator, JIT und Verbesserungen des Typen-Systems, der Fehlerbehandlung und der - Konsistenz. - </div> - <div class="php8-button-wrapper center"> - <a class="php8-button php8-button_light" href="/downloads">Wechsle jetzt zu PHP 8!</a> - </div> - </div> -</section> - -<section class="php8-section center"> - <div class="php8-compare"> - <h2 class="php8-h2" id="named-arguments"> - Named Arguments - <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'htmlspecialchars($string, double_encode: false);' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <ul> - <li>Gib nur notwendige Parameter an, überspringe optionale.</li> - <li>Parameter sind unabhängig von der Reihenfolge und selbstdokumentierend.</li> - </ul> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="attributes"> - Attribute - <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '/** -* @Route("/api/posts/{id}", methods={"GET", "HEAD"}) -*/ -class User -{' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '#[Route("/api/posts/{id}", methods: ["GET", "HEAD"])] -class User -{' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Anstelle von PHPDoc Annotations kannst du nun struktirierte Meta-Daten in nativer PHP Syntax nutzen.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="constructor-property-promotion"> - Constructor Property Promotion - <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '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; - } -}' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'class Point { - public function __construct( - public float $x = 0.0, - public float $y = 0.0, - public float $z = 0.0, - ) {} -}' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Weniger Codewiederholungen für das Definieren und Initialisieren von Objektattributen.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="union-types"> - Union Types - <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> <a class="php8-rfc" href="/manual/en/language.types.declarations.php#language.types.declarations.union">Doc</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'class Number { - /** @var int|float */ - private $number; - - /** - * @param float|int $number - */ - public function __construct($number) { - $this->number = $number; - } -} - -new Number(\'NaN\'); // Ok' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'class Number { - public function __construct( - private int|float $number - ) {} -} - -new Number(\'NaN\'); // TypeError' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Anstelle von PHPDoc Annotations für kombinierte Typen kannst du native Union-Type-Deklarationen verwenden, - welche zur Laufzeit validiert werden.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="match-expression"> - Match Ausdruck - <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'switch (8.0) { - case \'8.0\': - $result = "Oh no!"; - break; - case 8.0: - $result = "This is what I expected"; - break; -} -echo $result; -//> Oh no!' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'echo match (8.0) { -\'8.0\' => "Oh no!", -8.0 => "This is what I expected", -}; -//> This is what I expected' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Der neue Match Ausdruck ist ähnlich wie die Switch Anweisung und bietet folgende Funktionen:</p> - <ul> - <li>Match ist ein Ausruck. Das heißt, das Ergebnis kann in einer Variable gespeichert werden oder zurückgegeben - werden.</li> - <li>Match Zweige unterstützen nur einzeilige Ausdrücke und benötigen keinen break; Ausdruck.</li> - <li>Match führt strikte Vergleiche durch.</li> - </ul> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="nullsafe-operator"> - Nullsafe Operator - <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '$country = null; - -if ($session !== null) { - $user = $session->user; - - if ($user !== null) { - $address = $user->getAddress(); - - if ($address !== null) { - $country = $address->country; - } - } -}' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '$country = $session?->user?->getAddress()?->country;' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Anstelle von Null-Checks kannst du Funktionsaufrufe nun direkt mit dem neuen Nullsafe Operator - aneinanderreihen. Wenn ein Funktionsaufruf innerhalb der Kette Null zurückliefert, wird die weitere - Ausführung abgebrochen und die gesamte Kette wird zu Null ausgewertet.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="saner-string-to-number-comparisons"> - Vernünftige String-zu-Zahl Vergleiche - <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '0 == \'foobar\' // true' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '0 == \'foobar\' // false' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Wenn eine Zahl mit einem numerischen String verglichen wird, benutzt PHP 8 einen Zahlen-Vergleich. Andernfalls - wird die Zahl zu einem String konvertiert und ein String-Vergleich durchgeführt.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions"> - Konsistente Typen-Fehler für interne Funktionen - <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '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' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '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' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Die meisten internen Funktionen erzeugen nun eine Fatal Error Exception wenn die Typenvalidierung der Parameter - fehlschlägt.</p> - </div> - </div> -</section> - -<section class="php8-section php8-section_light"> - <h2 class="php8-h2">Just-In-Time Compiler</h2> - <p> - PHP 8 führt zwei JIT Compiler Engines ein. Tracing-JIT, der vielversprechendere der beiden, zeigt eine bis zu drei - mal bessere Performance in synthetischen Benchmarks und eine 1,5 bis zweifache Verbesserung in einigen speziellen, - langlaufenden Anwendungen. Die Performance einer typischen Anwendung ist auf dem Niveau von PHP 7.4. - </p> - <h3 class="php8-h3"> - Relativer Beitrag des JIT Compilers zur Performance von PHP 8 - </h3> - <p> - <img src="/images/php8/scheme.svg" width="900" alt="Just-In-Time compilation"> - </p> - - <div class="php8-columns"> - <div class="php8-column"> - <h2 class="php8-h2 php8-h2_margin-top">Verbesserungen am Typen-System und an der Fehlerbehandlung</h2> - <ul> - <li> - Striktere Typen-Checks für arithmetische/bitweise Operatoren - <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a> - </li> - <li> - Validierung abstrakter Methoden in einem Trait <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a> - </li> - <li> - Korrekte Signaturen magischer Funktionen <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a> - </li> - <li> - Neue Klassifizierung von Engine-Warnings <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a> - </li> - <li> - Inkompatiblen Methoden-Signaturen erzeugen einen Fatal Error <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a> - </li> - <li> - Der @ Operator unterdrückt keine Fatal Errors mehr. - </li> - <li> - Vererbung mit privaten Methoden <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a> - </li> - <li> - Mixed Typ <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a> - </li> - <li> - Static als Rückgabetyp <a href="https://wiki.php.net/rfc/static_return_type">RFC</a> - </li> - <li> - Typen für interne Funktionen - <a href="https://externals.io/message/106522">RFC</a> - </li> - <li> - Curl verwendet nun Objekte anstelle des resource Typs - <a href="https://php.watch/versions/8.0/resource-CurlHandle">RFC</a> - </li> - </ul> - </div> - <div class="php8-column"> - <h2 class="php8-h2 php8-h2_margin-top">Weitere Syntax-Anpassungen und Verbesserungen</h2> - <ul> - <li> - Erlauben eines Abschließenden Kommas in Parameter-Listen <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> - und Closure Use Listen <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a>. - </li> - <li> - Catches ohne Exception-Variable <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a> - </li> - <li> - Anpassungen an der Syntax für Variablen <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a> - </li> - <li> - Namespaces werden als ein Token ausgewertet <a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a> - </li> - <li> - Throw ist jetzt ein Ausdruck <a href="https://wiki.php.net/rfc/throw_expression">RFC</a> - </li> - <li> - Nutzung von ::class auf Objekten <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a> - </li> - </ul> - - <h2 class="php8-h2 php8-h2_margin-top">Neue Klassen, Interfaces, und Funktionen</h2> - <ul> - <li> - <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a> Klasse - </li> - <li> - <a href="https://wiki.php.net/rfc/stringable">Stringable</a> Interface - </li> - <li> - <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>, - <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>, - <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a> - </li> - <li> - <a href="https://github.com/php/php-src/pull/4769">fdiv()</a> - </li> - <li> - <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a> - </li> - <li> - <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a> - </li> - <li> - <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> mit einer Objekt-Implementierung - </li> - </ul> - </div> - </div> -</section> - -<section class="php8-section php8-section_dark php8-section_footer php8-footer"> - <div class="php8-section__content"> - <h2 class="php8-h2 center"> - Bessere Performance, bessere Syntax, optimierte Typsicherheit. - </h2> - <div class="php8-button-wrapper center"> - <a class="php8-button php8-button_light" href="/downloads">Wechsle jetzt zu PHP 8!</a> - </div> - <div class="php8-footer__content"> - <p> - Für den direkten Code-Download von PHP 8 schaue bitte auf der <a href="http://www.php.net/downloads">Downloads</a> Seite vorbei. - Windows Pakete können auf der <a href="http://windows.php.net/download">PHP for Windows</a> Seite gefunden werden. - Die Liste der Änderungen ist im <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a> festgehalten. - </p> - <p> - Der <a href="/manual/de/migration80.php">Migration Guide</a> ist im PHP Manual verfügbar. Lies dort - nach für detaillierte Informationen zu den neuen Funktionen und inkompatiblen Änderungen zu vorherigen PHP - Versionen. - </p> - </div> - </div> -</section> - - - - -<?php site_footer(); diff --git a/releases/8_0_x_pt_BR.php b/releases/8_0_x_pt_BR.php deleted file mode 100644 index 262673570..000000000 --- a/releases/8_0_x_pt_BR.php +++ /dev/null @@ -1,502 +0,0 @@ -<?php -$_SERVER['BASE_PAGE'] = 'releases/8_0_x.php'; -include_once __DIR__ . '/../include/prepend.inc'; - -if ($LANG === 'en') { - mirror_redirect('/releases/8_0_x.php?lang=' . urlencode($LANG)); -} - -if (($LANG !== 'pt_BR') && file_exists(__DIR__ . '/8_0_x_' . basename($LANG) . '.php')) { - mirror_redirect('/releases/8_0_x_' . urlencode($LANG) . '.php?lang=' . urlencode($LANG)); -} - -site_header("PHP 8.0.0 Release Announcement", array( - "current" => "php_8_0_x", - 'css' => array('php8.css'), - 'meta_tags' => array( - 'og:image' => $MYSITE . 'images/php8/php_8_released.png' - ) -)); -?> - <section class="php8-section php8-section_dark php8-section_header center"> - <div class="page-tools"> - <div class="change-language"> - <?php echo release_language_chooser($LANG); ?> - </div> - </div> - <div class="php8-section__content"> - <div class="php8-logo"> - <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343"> - </div> - <div class="php8-title">released!</div> - <div class="php8-subtitle"> - PHP 8.0 é uma atualização importante da linguagem PHP. <br class="display-none-md"> Ela contém muitos novos - recursos e otimizações, incluindo argumentos nomeados, união de tipos, atributos, promoção de propriedade do - construtor, expressão match, operador nullsafe, JIT e melhorias no sistema de tipos, tratamento de - erros e consistência. - </div> - <div class="php8-button-wrapper center"> - <a class="php8-button php8-button_light" href="/downloads">Atualize para o PHP 8!</a> - </div> - </div> - </section> - - <section class="php8-section center"> - <div class="php8-compare"> - <h2 class="php8-h2" id="named-arguments"> - Argumentos nomeados - <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'htmlspecialchars($string, double_encode: false);' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <ul> - <li>Especifique apenas os parâmetros obrigatórios, pulando os opcionais.</li> - <li>Os argumentos são independentes da ordem e autodocumentados.</li> - </ul> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="attributes"> - Atributos - <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '/** -* @Route("/api/posts/{id}", methods={"GET", "HEAD"}) -*/ -class User -{' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '#[Route("/api/posts/{id}", methods: ["GET", "HEAD"])] -class User -{' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Em vez de anotações PHPDoc, agora você pode usar metadados estruturados com a sintaxe nativa do PHP.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="constructor-property-promotion"> - Promoção de propriedade de construtor - <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '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; - } -}' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'class Point { - public function __construct( - public float $x = 0.0, - public float $y = 0.0, - public float $z = 0.0, - ) {} -}' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Menos código boilerplate para definir e inicializar propriedades.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="union-types"> - União de tipos - <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> <a class="php8-rfc" href="/manual/en/language.types.declarations.php#language.types.declarations.union">Doc</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'class Number { - /** @var int|float */ - private $number; - - /** - * @param float|int $number - */ - public function __construct($number) { - $this->number = $number; - } -} - -new Number(\'NaN\'); // Ok' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'class Number { - public function __construct( - private int|float $number - ) {} -} - -new Number(\'NaN\'); // TypeError' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Em vez de anotações PHPDoc para uma combinação de tipos, você pode usar declarações de união de tipos nativa - que são validados em tempo de execução.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="match-expression"> - Expressão match - <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'switch (8.0) { - case \'8.0\': - $result = "Oh no!"; - break; - case 8.0: - $result = "This is what I expected"; - break; -} -echo $result; -//> Oh no!' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'echo match (8.0) { - \'8.0\' => "Oh no!", - 8.0 => "This is what I expected", -}; -//> This is what I expected' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>A nova expressão match é semelhante ao switch e tem os seguintes recursos:</p> - <ul> - <li>Match é uma expressão, o que significa que seu resultado pode ser armazenado em uma variável ou - retornado.</li> - <li>Match suporta apenas expressões de uma linha e não precisa de uma declaração break;.</li> - <li>Match faz comparações estritas.</li> - </ul> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="nullsafe-operator"> - Operador nullsafe - <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '$country = null; - -if ($session !== null) { - $user = $session->user; - - if ($user !== null) { - $address = $user->getAddress(); - - if ($address !== null) { - $country = $address->country; - } - } -}' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '$country = $session?->user?->getAddress()?->country;' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Em vez de verificar condições nulas, agora você pode usar uma cadeia de chamadas com o novo operador nullsafe. - Quando a avaliação de um elemento da cadeia falha, a execução de toda a cadeia é abortada e toda a cadeia é - avaliada como nula.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="saner-string-to-number-comparisons"> - Comparações mais inteligentes entre strings e números - <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <pre>0 == 'foobar' // true</pre> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <pre>0 == 'foobar' // false</pre> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Ao comparar com uma string numérica, o PHP 8 usa uma comparação numérica. Caso contrário, ele converte o - número em uma string e usa uma comparação de string.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions"> - Erros consistentes para tipos de dados em funções internas - <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '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' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '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' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>A maioria das funções internas agora lançam uma exceção Fatal Error se a validação do parâmetro falhar.</p> - </div> - </div> - </section> - - <section class="php8-section php8-section_light"> - <h2 class="php8-h2">Compilação Just-In-Time</h2> - <p> - PHP 8 apresenta dois motores de compilação JIT. Tracing JIT, o mais promissor dos dois, mostra desempenho cerca de - 3 vezes melhor em benchmarks sintéticos e melhoria de 1,5 a 2 vezes em alguns aplicativos específicos de longa - execução. O desempenho típico das aplicações está no mesmo nível do PHP 7.4. - </p> - <h3 class="php8-h3"> - Relative JIT contribution to PHP 8 performance - </h3> - <p> - <img src="/images/php8/scheme.svg" width="900" alt="Just-In-Time compilation"> - </p> - - <div class="php8-columns"> - <div class="php8-column"> - <h2 class="php8-h2 php8-h2_margin-top">Melhorias no sistema de tipo e tratamento de erros</h2> - <ul> - <li> - Verificações de tipo mais rígidas para operadores aritméticos / bit a bit - <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a> - </li> - <li> - Validação de método abstrato em traits - <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a> - </li> - <li> - Assinaturas corretas de métodos mágicos <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a> - </li> - <li> - Avisos de motor reclassificados <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a> - </li> - <li> - Erro fatal para assinaturas de método incompatíveis <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a> - </li> - <li> - O operador @ não silencia mais os erros fatais. - </li> - <li> - Herança com métodos privados <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a> - </li> - <li> - Tipo mixed <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a> - </li> - <li> - Tipo de retorno static <a href="">RFC</a> - </li> - <li> - Tipagem de funções internas - <a href="https://externals.io/message/106522">RFC</a> - </li> - <li> - Objetos curl em vez de recursos - <a href="https://php.watch/versions/8.0/resource-CurlHandle">RFC</a> - </li> - </ul> - </div> - <div class="php8-column"> - <h2 class="php8-h2 php8-h2_margin-top">Outros ajustes e melhorias de sintaxe</h2> - <ul> - <li> - Permitir vírgula no final da lista de parâmetros - <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> e listas de uso em closures - <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a> - </li> - <li> - Catches sem variável na captura de exceção <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a> - </li> - <li> - Ajustes de sintaxe para variáveis <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a> - </li> - <li> - Tratamento de nomes de namespace como token único - <a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a> - </li> - <li> - Throw como expressão <a href="https://wiki.php.net/rfc/throw_expression">RFC</a> - </li> - <li> - Permitir ::class em objetos <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a> - </li> - </ul> - - <h2 class="php8-h2 php8-h2_margin-top">Novas classes, interfaces e funções</h2> - <ul> - <li> - Classe <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a> - </li> - <li> - Interface <a href="https://wiki.php.net/rfc/stringable">Stringable</a> - </li> - <li> - <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>, - <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>, - <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a> - </li> - <li> - <a href="https://github.com/php/php-src/pull/4769">fdiv()</a> - </li> - <li> - <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a> - </li> - <li> - <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a> - </li> - <li> - <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> implementado com objetos - </li> - </ul> - </div> - </div> - </section> - - <section class="php8-section php8-section_dark php8-section_footer php8-footer"> - <div class="php8-section__content"> - <h2 class="php8-h2 center"> - Obtenha melhoria de desempenho gratuita.<br class="display-none-lg display-block-md"> - Obtenha melhor sintaxe.<br class="display-block-lg display-none-md display-block-sm"> - Obtenha mais segurança de tipos. - </h2> - <div class="php8-button-wrapper center"> - <a class="php8-button php8-button_light" href="/downloads">Atualize para o PHP 8!</a> - </div> - <div class="php8-footer__content"> - <p> - Para downloads do código-fonte do PHP 8, visite a página de - <a href="http://www.php.net/downloads">downloads</a>. - Os binários do Windows podem ser encontrados na página <a href="http://windows.php.net/download">PHP para - Windows</a>. - A lista de mudanças é registrada no <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a>. - </p> - <p> - O <a href="/manual/pt_BR/migration80.php">guia de migração</a> está disponível no Manual do PHP. - Consulte-o para obter uma lista detalhada de novos recursos e alterações incompatíveis com versões anteriores. - </p> - </div> - </div> - </section> - - - - -<?php site_footer(); \ No newline at end of file diff --git a/releases/8_0_x_ru.php b/releases/8_0_x_ru.php deleted file mode 100644 index 59e3f7f6e..000000000 --- a/releases/8_0_x_ru.php +++ /dev/null @@ -1,497 +0,0 @@ -<?php -$_SERVER['BASE_PAGE'] = 'releases/8_0_x_ru.php'; -include_once __DIR__ . '/../include/prepend.inc'; - -if ($LANG === 'en') { - mirror_redirect('/releases/8_0_x.php?lang=' . urlencode($LANG)); -} - -if (($LANG !== 'ru') && file_exists(__DIR__ . '/8_0_x_' . basename($LANG) . '.php')) { - mirror_redirect('/releases/8_0_x_' . urlencode($LANG) . '.php?lang=' . urlencode($LANG)); -} - -site_header("PHP 8.0.0, релиз", array( - "current" => "php_8_0_x_ru", - 'css' => array('php8.css'), - 'meta_tags' => array( - 'og:image' => $MYSITE . 'images/php8/php_8_released.png' - ) -)); -?> -<section class="php8-section php8-section_dark php8-section_header center"> - <div class="page-tools"> - <div class="change-language"> - <?php echo release_language_chooser($LANG); ?> - </div> - </div> - <div class="php8-section__content"> - <div class="php8-logo"> - <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343"> - </div> - <div class="php8-title">релизнут!</div> - <div class="php8-subtitle"> - PHP 8.0 — большое обновление PHP.<br class="display-none-md"> Оно содержит множество новых возможностей и - оптимизаций, включая именованные аргументы, union type, атрибуты, упрощённое определение свойств в конструкторе, выражение match, - оператор nullsafe, JIT и улучшения в системе типов, обработке ошибок и консистентности. - </div> - <div class="php8-button-wrapper center"> - <a class="php8-button php8-button_light" href="/downloads">Переходите на PHP 8!</a> - </div> - </div> -</section> - -<section class="php8-section center"> - <div class="php8-compare"> - <h2 class="php8-h2" id="named-arguments"> - Именованные аргументы - <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'htmlspecialchars($string, double_encode: false);' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <ul> - <li>Указывайте только необходимые параметры, пропускайте необязательные.</li> - <li>Порядок аргументов не важен, аргументы самодокументируемы.</li> - </ul> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="attributes"> - Атрибуты - <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '/** -* @Route("/api/posts/{id}", methods={"GET", "HEAD"}) -*/ -class User -{' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '#[Route("/api/posts/{id}", methods: ["GET", "HEAD"])] -class User -{' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Вместо аннотаций PHPDoc вы можете использовать структурные метаданные с нативным синтаксисом PHP.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="constructor-property-promotion"> - Объявление свойств в конструкторе - <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '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; - } -}' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'class Point { - public function __construct( - public float $x = 0.0, - public float $y = 0.0, - public float $z = 0.0, - ) {} -}' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Меньше шаблонного кода для определения и инициализации свойств.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="union-types"> - Union types - <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> <a class="php8-rfc" href="/manual/ru/language.types.declarations.php#language.types.declarations.union">Doc</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'class Number { - /** @var int|float */ - private $number; - - /** - * @param float|int $number - */ - public function __construct($number) { - $this->number = $number; - } -} - -new Number(\'NaN\'); // Нет ошибки' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'class Number { - public function __construct( - private int|float $number - ) {} -} - -new Number(\'NaN\'); // TypeError' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Вместо аннотаций PHPDoc для объединенных типов вы можете использовать объявления union type, которые - проверяются во время выполнения.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="match-expression"> - Выражение Match - <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'switch (8.0) { - case \'8.0\': - $result = "О нет!"; - break; - case 8.0: - $result = "То, что я и ожидал"; - break; -} -echo $result; -//> О нет!' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - 'echo match (8.0) { - \'8.0\' => "О нет!", - 8.0 => "То, что я и ожидал", -}; -//> То, что я и ожидал' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Новое выражение match похоже на оператор switch со следующими особенностями:</p> - <ul> - <li>Match — это выражение, его результат может быть сохранён в переменной или возвращён.</li> - <li>Условия match поддерживают только однострочные выражения, для которых не требуется управляющая конструкция break;.</li> - <li>Выражение match использует строгое сравнение.</li> - </ul> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="nullsafe-operator"> - Оператор Nullsafe - <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '$country = null; - -if ($session !== null) { - $user = $session->user; - - if ($user !== null) { - $address = $user->getAddress(); - - if ($address !== null) { - $country = $address->country; - } - } -}' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '$country = $session?->user?->getAddress()?->country;' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Вместо проверки на null вы можете использовать последовательность вызовов с новым оператором Nullsafe. Когда - один из элементов в последовательности возвращает null, выполнение прерывается и вся последовательность - возвращает null.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="saner-string-to-number-comparisons"> - Улучшенное сравнение строк и чисел - <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '0 == \'foobar\' // true' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '0 == \'foobar\' // false' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>При сравнении с числовой строкой PHP 8 использует сравнение чисел. В противном случае число преобразуется в - строку и используется сравнение строк.</p> - </div> - </div> - - <div class="php8-compare"> - <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions"> - Ошибки согласованности типов для встроенных функций - <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a> - </h2> - <div class="php8-compare__main"> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label">PHP 7</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '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' - );?> - </div> - </div> - <div class="php8-compare__arrow"></div> - <div class="php8-compare__block example-contents"> - <div class="php8-compare__label php8-compare__label_new">PHP 8</div> - <div class="php8-code phpcode"> - <?php highlight_php_trimmed( - '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' - );?> - </div> - </div> - </div> - <div class="php8-compare__content"> - <p>Большинство внутренних функций теперь выбрасывают исключение Fatal Error, если при проверке параметра возникает ошибка.</p> - </div> - </div> -</section> - -<section class="php8-section php8-section_light"> - <h2 class="php8-h2">Компиляция Just-In-Time</h2> - <p> - PHP 8 представляет два механизма JIT-компиляции. Трассировка JIT, наиболее перспективная из них, на синтетических бенчмарках показывает - улучшение производительности примерно в 3 раза и в 1,5–2 раза на некоторых долго работающих приложениях. Стандартная - производительность приложения находится на одном уровне с PHP 7.4. - </p> - <h3 class="php8-h3"> - Relative JIT contribution to PHP 8 performance - </h3> - <p> - <img src="/images/php8/scheme.svg" width="900" alt="Ккомпиляция Just-In-Time"> - </p> - - <div class="php8-columns"> - <div class="php8-column"> - <h2 class="php8-h2 php8-h2_margin-top">Улучшения в системе типов и обработке ошибок</h2> - <ul> - <li> - Более строгие проверки типов для арифметических/побитовых операторов - <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a> - </li> - <li> - Проверка методов абстрактных трейтов <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a> - </li> - <li> - Правильные сигнатуры магических методов <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a> - </li> - <li> - Реклассификация предупреждений движка <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a> - </li> - <li> - Фатальная ошибка при несовместимости сигнатур методов <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a> - </li> - <li> - Оператор @ больше не подавляет фатальные ошибки. - </li> - <li> - Наследование с private методами <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a> - </li> - <li> - Новый тип mixed <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a> - </li> - <li> - Возвращаемый тип static <a href="https://wiki.php.net/rfc/static_return_type">RFC</a> - </li> - <li> - Типы для стандартных функций - <a href="https://externals.io/message/106522">RFC</a> - </li> - <li> - Объекты вместо ресурсов для cURL - <a href="https://php.watch/versions/8.0/resource-CurlHandle">RFC</a> - </li> - </ul> - </div> - <div class="php8-column"> - <h2 class="php8-h2 php8-h2_margin-top">Прочие улучшения синтаксиса</h2> - <ul> - <li> - Разрешена запятая в конце списка параметров <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> - и в списке use замыканий <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a> - </li> - <li> - Блок catch без указания переменной <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a> - </li> - <li> - Изменения синтаксиса переменных <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a> - </li> - <li> - Имена в пространстве имен рассматриваются как единый токен <a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a> - </li> - <li> - Выражение Throw <a href="https://wiki.php.net/rfc/throw_expression">RFC</a> - </li> - <li> - Добавление ::class для объектов <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a> - </li> - </ul> - - <h2 class="php8-h2 php8-h2_margin-top">Новые классы, интерфейсы и функции</h2> - <ul> - <li> - Класс <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a> - </li> - <li> - Интерфейс <a href="https://wiki.php.net/rfc/stringable">Stringable</a> - </li> - <li> - <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>, - <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>, - <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a> - </li> - <li> - <a href="https://github.com/php/php-src/pull/4769">fdiv()</a> - </li> - <li> - <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a> - </li> - <li> - <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a> - </li> - <li> - Объектно-ориентированная функция <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> - </li> - </ul> - </div> - </div> -</section> - -<section class="php8-section php8-section_dark php8-section_footer php8-footer"> - <div class="php8-section__content"> - <h2 class="php8-h2 center"> - Выше производительность, лучше синтаксис, надежнее система типов. - </h2> - <div class="php8-button-wrapper center"> - <a class="php8-button php8-button_light" href="/downloads">Переходите на PHP 8!</a> - </div> - <div class="php8-footer__content"> - <p> - Для загрузки исходного кода PHP 8 посетите страницу <a href="http://www.php.net/downloads">downloads</a>. - Бинарные файлы Windows находятся на сайте <a href="http://windows.php.net/download">PHP для Windows</a>. - Список изменений представлен в <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a>. - </p> - <p> - <a href="/manual/ru/migration80.php">Руководство по миграции</a> доступно в разделе документации. Пожалуйста, - изучите его для получения подробного списка новых возможностей и обратно несовместимых изменений. - </p> - </div> - </div> -</section> - - - - -<?php site_footer();
« previous php.webmaster (#28889) next »