Novinky PHP 5.6 až 8.4
Vývoj PHP jsem přestal detailně sledovat u verze 5.5. Od té doby si nějakých změn čas od času všimnu, ale ke konkrétní verzi je přiřadit nedokážu. Proto si udělám malý přehled:
PHP 5.6
- Výchozí hodnoty můžou obsahovat konstantní výraz:
function f($a = 1 + 2). - Konstanty můžou obsahovat pole:
const A = []. - Funkce s proměnným počtem parametrů k nim můžou snadněji přistupovat:
function f(...$args). - Podobným způsobem lze parametry i předávat:
f(...$args). - Přibyl operátor mocniny:
2 ** 3. - Operátor
usemůže do jmenných prostorů importovat i funkce a konstanty:use function f. - Metodou
__debuginfolze ovlivnit výstupvar_dump. - Přibyly funkce
hash_equals(); session_abort(); session_reset().
PHP 7.0
- Přibyl null coalescing operátor:
$a ?? 0. - Přibyl spaceship operátor:
1 <=> 2. - Přibyly anonymní třídy:
new class {}. - V řetězcích lze zadávat kódy Unicode znaků:
"\u{aa}". - Metodou
Closure::calllze anonymní funkci snadněji zavolat s objektem.:$f->call(new C). - Operátor
usedovoluje používat skupiny:use Namespace\{A, B, C}. - Funkce s operátorem
yieldmůžou mít i návratovou hodnotu:function f() { yield 1; return 2; }. - Přibyl operátor
yield from:yield from gen(). - Přibyla funkce pro celočíselné dělení
intdev. - Přibyly funkce
random_intarandom_bytes. - Operátor
listfunguje správně i s objekty implementujícímiArrayAccess. - U naklonovaných objektů jde rovnou volat metody:
(clone $c)->f(). - Chyby úrovně
E_STRICTbyly rozstrkané do jiných úrovní. - Řetězce s hexadecimálními čísly už nejsou považované za číselné:
"0x0a" != 10. - Zanikly funkce
call_user_method,set_magic_quotes_runtime,ereg,mysql_querya příbuzné. - Přibyly funkce
error_clear_last(); intdiv(); preg_replace_callback_array().
PHP 7.1
[]lze používat místolist:foreach ($data as [$id, $name]).- U třídních konstant jde určit viditelnost:
private const A = 1. - Při ošetřování výjimek jich lze v
catchuvést více:catch (FirstException | SecondException $e). listpodporuje klíče:list("id" => $id) = $row.- Lze použít záporný string offset, který se počítá odzadu:
$s[-1]. - Zavolání funkce s málo parametry místo varování skončí fatální chybou.
- Počítání s řetězcem začínajícím číslem vyvolá noticku:
"1a" * 2. - Přibyly funkce
Closure::fromCallable; session_create_id(); session_gc(); is_iterable().
PHP 7.2
- Přístup k nedefinovaným konstantám skončí varováním:
echo UNDEF. - Funkce
countvaruje při předání nespočetných typů:count(1). - Přibyly funkce
spl_object_id(); imageresolution(); hash_hmac_algos(); mb_chr(); mb_ord().
PHP 7.3
- V heredoc a nowdoc syntaxi může být ukončovač odsazen, což způsobí od-odsazení výsledného textu.
listpodporuje reference:[&$a] = $data.- Za posledním argumentem volaných funkcí lze napsat čárku:
f(1,). - Přibyly funkce
array_key_first(); array_key_last(); gc_status(); hrtime(); is_countable(); net_get_interfaces().
PHP 7.4
- Anonymní funkce lze definovat pomocí
fn:fn($a) => 2 * $a. - Přibyl operátor
??=:$a ??= 0;. - V definici polí lze rozbalit jiná pole:
[1, ...[2, 3], 4]. - V číslech lze použít oddělovač
_:123_000. - Přibyly metody
__serializea__unserializejako náhrada zaSerializable. - Použití
[]u hodnot, které to nepodporují, vyvolá noticku:$int[0]. - Přibyly funkce
get_mangled_object_vars(); password_algos(); mb_str_split().
PHP 8.0
- Funkce podporují pojmenované parametry:
f(a: 1). - Třídy a další prvky můžou používat atributy (v jiných jazycích se jim říká anotace):
#[Attribute] class C {}. - V konstruktoru jde rovnou deklarovat třídní proměnné:
function __construct(private int $a). - Přibyl výraz
match:match ($a) { 1 => 'x', }. - Přibyl operátor
?->:$o?->f(). - Název třídy lze získat pomocí
$object::class. - V deklaraci funkcí lze za posledním parametrem napsat čárku:
function f($a,). - Při ošetřování výjimek je v bloku
catchnení potřeba ukládat do proměnné:catch (Exception). - Porovnávání čísel a řetězců číslo nejprve převede na řetězec:
0 == "" // dříve true, nyní false. - Metody s názvem odpovídajícím třídě už nejsou považované za konstruktory.
- Zanikla proměnná
$php_errormsg. - Zanikly funkce
__autoload,create_function,each,get_magic_quotes_gpc,get_magic_quotes_runtime. implodeuž nepodporuje prohození parametrů.- Locale už se nepřebírá z prostředí.
- Výchozí reportování chyb je
E_ALL. - Operátor
.se vyhodnocuje později než+a-:'Sum: ' . $a + $b. - Některá varování vyvolají výjimku:
$null->a = 1; $a[$array] = 1; $scalar[0] = 1; echo UNDEF; count(1);. - Některé noticky byly převedeny na varování:
$undef; $a->undef; $a['undef']; $null->a; $scalar[0]; echo $array; $s[null]; $s[$long]; $s[0] = ""; "1a" * 2;. - Nové varování:
$s[0] = "ab";. - Aritmetické operátory vyhodí výjimku při použití s nepodporovanými typy:
[] * 2. - Převod desetinných čísel na řetězec nyní jako oddělovač vždycky použije tečku.
- Pro přístup k prvkům pole už nejde používat složené závorky:
$a{0}. - Zanořené ternární výrazy nyní vyžadují závorky:
(0 ? 1 : (2 ? 3 : 4)). - S číslem v řetězci zakončeném mezerami jde počítat:
"1 " * 2. parse_strvyžaduje druhý parametr.- Přibyly třídy
PhpToken,XMLParser,XMLWriter. - Přibyly funkce
str_contains(); str_starts_with(); str_ends_with(); preg_last_error_msg(); fdiv(); get_debug_type().
PHP 8.1
- Lze definovat enumerace:
enum E { case A; case B; }. - Čísla lze psát v osmičkové soustavě:
0o777. - Při rozbalování polí lze používat řetězcové klíče:
[...['a' => 1]]. - V deklaraci funkcí lze po variadickém parametru přidat ještě pojmenovaný:
function f(...$arg, named: $arg). - Přibylo
$_FILES['name']['full_path']. - Přibyly
Fibers. - Callables lze vytvořit pomocí
(...):array_map(strlen(...), $array). - Ve výchozích hodnotách parametrů lze vytvořit objekty:
function f($a = new A). - Vlastnosti lze deklarovat jako
readonly. - Třídní konstanty můžou být finální:
final public const X = ''. htmlspecialcharsdefaultně používáENT_QUOTES.- Přibyla funkce
array_is_list().
PHP 8.2
- Přibyl předdefinovaný atribut
#[\SensitiveParameter]. - Traits umožňují definovat konstanty.
- Jako
readonlymohou být označené celé třídy. strtolowera spol. už neberou ohled na locale.- Přibyly funkce
memory_reset_peak_usage(); ini_parse_quantity(); libxml_get_external_entity_loader().
PHP 8.3
- Přibyl předdefinovaný atribut
#[\Override]. - Statické proměnné můžou být inicializované výrazem:
static $a = f(). number_formatumožňuje zaokrouhlit před desetinnou čárkou:number_format(123, -1).- Přibyly funkce
json_validate(); str_increment(); str_decrement(); stream_context_set_options().
PHP 8.4
- Přibyl předdefinovaný atribut
#[\Deprecated]. - Pro čtení a zápis třídních proměnných lze nově definovat funkce:
public string $fullName { get => $this->firstName . ' ' . $this->lastName; }. - Třídní proměnné můžou mít jinou viditelnost pro čtení a zápis:
public protected(set) string $name. - Při volání metody zrovna vytvořeného objektu lze vynechat závorky:
new A()->f(). - Přibyla třída
Dom\HTMLDocumentpro práci s HTML 5. - Přibyly funkce
request_parse_body(); http_get_last_response_headers(); http_clear_last_response_headers(); fpow(); array_all(); array_any(); array_find(); array_find_key().
Změny v deklaraci typů jsem vyčlenil zvlášť:
- 7.0 Lze deklarovat skalární typy:
function f(int $i). - 7.0 Lze deklarovat návratové typy:
function f(): int. - 7.1 Typy můžou být deklarované jako nullable:
function f(?int $i). - 7.1 Funkce můžou deklarovat návratový typ
void:function f(): void. - 7.1 Pro deklaraci typů lze používat
iterable, což přijmearrayaTraversable. - 7.2 V deklaraci typů lze použít
object:function f(): object. - 7.4 U třídních proměnných lze deklarovat typ:
class C { public int $id; }. - 8.0 V deklaraci typů jich lze spojit více:
function f(): A|B. - 8.0 V návratovém typu lze použít
static:function f(): static. - 8.0 Při deklaraci typů lze použít
mixed. - 8.1 V deklaraci typů lze použít průnik:
function f(C&I $a). - 8.1 V deklaraci návratových typů lze použít
neverříkající, že funkce nikdy neskončí normálně (ale třeba vyhodí výjimku). - 8.2 Při deklaraci typů lze kombinovat sjednocení a průnik:
(A&B)|C. - 8.3 Konstanty umožňují deklarovat typ:
const int A = 1.
Pro testování kompatibility kódu je k nezaplacení 3v4l. Detailnější přehled změn je na PHP.Watch.
Jakub Vrána, Seznámení s oblastí
Diskuse
Honza:
Skvělý přehled, díky za něj!Diskuse je zrušena z důvodu spamu.

