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
use
může do jmenných prostorů importovat i funkce a konstanty:use function f
. - Metodou
__debuginfo
lze 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::call
lze anonymní funkci snadněji zavolat s objektem.:$f->call(new C)
. - Operátor
use
dovoluje používat skupiny:use Namespace\{A, B, C}
. - Funkce s operátorem
yield
můž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_int
arandom_bytes
. - Operátor
list
funguje správně i s objekty implementujícímiArrayAccess
. - U naklonovaných objektů jde rovnou volat metody:
(clone $c)->f()
. - Chyby úrovně
E_STRICT
byly 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_query
a 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
catch
uvést více:catch (FirstException | SecondException $e)
. list
podporuje 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
count
varuje 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.
list
podporuje 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
__serialize
a__unserialize
jako 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
catch
není 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
. implode
už 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_str
vyž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 = ''
. htmlspecialchars
defaultně 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
readonly
mohou být označené celé třídy. strtolower
a 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_format
umožň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řibyla třída
Dom\HTMLDocument
pro 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řijmearray
aTraversable
. - 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.
Diskuse
Honza:
Skvělý přehled, díky za něj!Diskuse je zrušena z důvodu spamu.

