ОбъявлСния Ρ‚ΠΈΠΏΠΎΠ²

ОбъявлСния Ρ‚ΠΈΠΏΠΎΠ² Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, значСниям Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°, начиная с PHP 7.4.0 свойствам класса ΠΈ начиная с PHP 8.3.0 константам класса. ОбъявлСния Ρ‚ΠΈΠΏΠΎΠ² Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ, ΠΈΠ½Π°Ρ‡Π΅ PHP выбросит ΠΎΡˆΠΈΠ±ΠΊΡƒ TypeError.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ PHP, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ рСсурсов (resource), Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ объявлСнии Ρ‚ΠΈΠΏΠ°. Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° содСрТит ΠΆΡƒΡ€Π½Π°Π» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ доступности ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ, которая описываСт ΠΏΡ€Π°Π²ΠΈΠ»Π° объявлСния Ρ‚ΠΈΠΏΠΎΠ².

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

Класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ интСрфСйса ΠΈΠ»ΠΈ пСрСопрСдСляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса, подчиняСтся ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ совмСстимости. ΠœΠ΅Ρ‚ΠΎΠ΄ совмСстим, Ссли слСдуСт ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ вариантности.

Бписок измСнСний

ВСрсия ОписаниС
8.3.0 Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ констант классов, интСрфСйсов, Ρ‚Ρ€Π΅ΠΉΡ‚ΠΎΠ² ΠΈ пСрСчислСний.
8.2.0 Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ DNF-Ρ‚ΠΈΠΏΠΎΠ².
8.2.0 Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° true.
8.2.0 Π’ΠΈΠΏΡ‹ null ΠΈ false Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.
8.1.0 Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ пСрСсСчСний Ρ‚ΠΈΠΏΠΎΠ².
8.1.0 Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΏΠΎ ссылкС ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Ρ‚ΠΈΠΏΠΎΠΌ значСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° void устарСл.
8.1.0 Для значСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ‚ΠΈΠΏΠ° never.
8.0.0 Для значСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ‚ΠΈΠΏΠ° mixed.
8.0.0 Для значСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ‚ΠΈΠΏΠ° static.
8.0.0 Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ объСдинСния Ρ‚ΠΈΠΏΠΎΠ².
7.4.0 Π”ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ свойств классов.
7.2.0 Для значСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ‚ΠΈΠΏΠ° object.
7.1.0 Для значСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ‚ΠΈΠΏΠ° iterable.
7.1.0 Для значСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ‚ΠΈΠΏΠ° void.
7.1.0 Для значСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ обнуляСмого Ρ‚ΠΈΠΏΠ°.

АтомарныС Ρ‚ΠΈΠΏΡ‹

АтомарныС Ρ‚ΠΈΠΏΡ‹ Π²Π΅Π΄ΡƒΡ‚ сСбя прямолинСйно, Π½ΠΎ с рядом ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ описываСт этот Ρ€Π°Π·Π΄Π΅Π».

БкалярныС Ρ‚ΠΈΠΏΡ‹

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

ΠŸΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ‹ ΠΈΠΌΡ‘Π½ для скалярных Ρ‚ΠΈΠΏΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ относятся Ρ‚ΠΈΠΏΡ‹ bool, int, float ΠΈ string, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ. ВмСсто назначСния псСвдонимов названия классов ΠΈ интСрфСйсов Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏΡ‹. НапримСр, Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ boolean Π² объявлСнии Ρ‚ΠΈΠΏΠ° ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выполняло условиС instanceof Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ класса ΠΈΠ»ΠΈ интСрфСйса boolean, Π° Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Π»ΠΎ Ρ‚ΠΈΠΏΡƒ bool:

<?php

function test(boolean $param) {}
test(true);

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² PHP 8:

Warning: "boolean" will be interpreted as a class name. Did you mean "bool"? Write "\boolean" to suppress this warning in /in/9YrUX on line 2

Fatal error: Uncaught TypeError: test(): Argument #1 ($param) must be of type boolean, bool given, called in - on line 3 and defined in -:2
Stack trace:
#0 -(3): test(true)
#1 {main}
  thrown in - on line 2

Π’ΠΈΠΏ void

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΏΠΎ ссылкС ΠΈΠ· void-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ устарСл начиная с PHP 8.1.0, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ такая функция ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΠ²Π°. РаньшС ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠΆΠ΅ Π²Ρ‹Π΄Π°Π²Π°Π»Π°ΡΡŒ ошибка уровня E_NOTICE: Волько ссылки Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ссылкС.

<?php

function &test(): void {}

?>

Π’ΠΈΠΏ Callable

Бвойствам класса нСльзя ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ callable.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π’ΠΈΠΏ callable нСльзя ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ОбъявлСниС Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ссылку

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ссылку, провСряСт Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π² Π½Π°Ρ‡Π°Π»Π΅ Π²Ρ‹Π·ΠΎΠ²Π°, Π½ΠΎ Π½Π΅ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, поэтому Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ссылки Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 Π’ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ссылку

<?php

function array_baz(array &$param)
{
$param = 1;
}

$var = [];
array_baz($var);
var_dump($var);
array_baz($var);

?>

Π’Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ…ΠΎΠΆ Π½Π°:

int(1)

Fatal error: Uncaught TypeError: array_baz(): Argument #1 ($param) must be of type array, int given, called in - on line 9 and defined in -:2
Stack trace:
#0 -(9): array_baz(1)
#1 {main}
  thrown in - on line 2

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠΎ составным Ρ‚ΠΈΠΏΠ°ΠΌ

На объявлСния составных Ρ‚ΠΈΠΏΠΎΠ² распространяСтся ряд ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ; компилятор выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ избыточности Ρ‚ΠΈΠΏΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ простыС ошибки.

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅ΠΆΠ΅Π½ΠΈΠ΅

ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ пСрСсСчСний ΠΈ объСдинСний Ρ‚ΠΈΠΏΠΎΠ² ΠΎΡΡ‚Π°Π²Π°Π»ΠΎΡΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Π΄ΠΎ PHP 8.2.0 ΠΈ ввСдСния DNF-Ρ‚ΠΈΠΏΠΎΠ².

ОбъСдинСниС Ρ‚ΠΈΠΏΠΎΠ²

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

НСвозмоТно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Ρ‘Π½Π½ΠΎΠΌ Ρ‚ΠΈΠΏΠ΅ Π΄Π²Π° одноэлСмСнтных Ρ‚ΠΈΠΏΠ° false ΠΈ true. ВмСсто этого ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ‚ΠΈΠΏ bool.

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅ΠΆΠ΅Π½ΠΈΠ΅

Π”ΠΎ PHP 8.2.0 Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ false ΠΈ null ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, поэтому объСдинСниС Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ состояло Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· этих Ρ‚ΠΈΠΏΠΎΠ², ΠΎΡΡ‚Π°Π²Π°Π»ΠΎΡΡŒ нСдопустимым. К Ρ‚Π°ΠΊΠΈΠΌ объСдинСниям относятся Ρ‚ΠΈΠΏΡ‹: false, false|null ΠΈ ?false.

БинтаксичСский сахар обнуляСмого Ρ‚ΠΈΠΏΠ°

ОбъявлСниС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΠΎΠΌΠ΅Ρ‡Π°ΡŽΡ‚ ΠΊΠ°ΠΊ nullable ΠΏΡƒΡ‚Ρ‘ΠΌ добавлСния ΠΊ Ρ‚ΠΈΠΏΡƒ прСфикса Π² Π²ΠΈΠ΄Π΅ Π²ΠΎΠΏΡ€ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° (?). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡ‹ ?T ΠΈ T|null ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π­Ρ‚ΠΎΡ‚ синтаксис поддСрТиваСтся с PHP 7.1.0 ΠΈ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ объСдинСния Ρ‚ΠΈΠΏΠΎΠ².

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ способ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ nullable-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null. ΠžΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ Ρ‚Π°ΠΊΠΈΠΌ способом Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌ классС Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ², ΠΈ ΠΊ объявлСнию Ρ‚ΠΈΠΏΠ° потрСбуСтся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ null. Π­Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ устарСло начиная с PHP 8.4.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 Π‘Ρ‚Π°Ρ€Ρ‹ΠΉ способ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ nullable-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

<?php

class C {}

function
f(C $c = null)
{
var_dump($c);
}

f(new C());
f(null);

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

object(C)#1 (0) {
}
NULL

ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ ΠΈ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹

ΠŸΡ€Π°Π²ΠΈΠ»Π° объявлСния составных Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ ряд ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ. ΠŸΡ€ΠΈ компиляции ΠΊΠΎΠ΄Π° с ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Π±Π΅Π· Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ классов, Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ошибок Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… составных Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚:

  • ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ int|string|INT ΠΈΠ»ΠΈ Countable&Traversable&COUNTABLE Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ послС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ названия Ρ‚ΠΈΠΏΠ° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ срСдствами языка Ρ‚ΠΈΠΏ встрСтится большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°.
  • ОбъявлСниС Ρ‚ΠΈΠΏΠ° mixed ΠΈΠ»ΠΈ never с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ.
  • Ошибки объСдинСния Ρ‚ΠΈΠΏΠΎΠ²:
    • Π˜Π·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ объявлСниС Ρ‚ΠΈΠΏΠ° false ΠΈΠ»ΠΈ true вмСстС с Ρ‚ΠΈΠΏΠΎΠΌ bool.
    • Π˜Π·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ объявлСниС Ρ‚ΠΈΠΏΠ° класса вмСстС с Ρ‚ΠΈΠΏΠΎΠΌ object.
    • Π˜Π·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ объявлСниС Ρ‚ΠΈΠΏΠ° array ΠΈΠ»ΠΈ Traversable вмСстС с Ρ‚ΠΈΠΏΠΎΠΌ iterable.
  • Ошибки пСрСсСчСния Ρ‚ΠΈΠΏΠΎΠ²:
    • ОбъявлСниС Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ относится ΠΊ классовому Ρ‚ΠΈΠΏΡƒ.
    • ОбъявлСниС Ρ‚ΠΈΠΏΠ° self, parent ΠΈΠ»ΠΈ static.
  • Ошибки объявлСния DNF-Ρ‚ΠΈΠΏΠΎΠ²:
    • Π˜Π·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ объявлСниС Π±ΠΎΠ»Π΅Π΅ строго Ρ‚ΠΈΠΏΠ° с Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰ΠΈΠΌ Ρ‚ΠΈΠΏΠΎΠΌ.
    • ОбъявлСниС Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² Π² пСрСсСчСнии Ρ‚ΠΈΠΏΠΎΠ².

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π­Ρ‚ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ Β«ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½Β» ΠΈ Π½Π΅ содСрТит ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для этого ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ всС ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ классов.

НапримСр, Ссли Ρ‚ΠΈΠΏΡ‹ A ΠΈ B β€” псСвдонимы классов, Ρ‚ΠΎ составной Ρ‚ΠΈΠΏ A|B остаётся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ объСдинСниСм Ρ‚ΠΈΠΏΠΎΠ², Π΄Π°ΠΆΠ΅ Ссли Ρ‚ΠΈΠΏ получится свСсти Π»ΠΈΠ±ΠΎ ΠΊ A, Π»ΠΈΠ±ΠΎ ΠΊ B. Аналогично, Ссли класс B extends A {}, Ρ‚ΠΎ составной Ρ‚ΠΈΠΏ A|B Ρ‚Π°ΠΊΠΆΠ΅ относится ΠΊ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΌΡƒ объСдинСнию Ρ‚ΠΈΠΏΠΎΠ², Π΄Π°ΠΆΠ΅ Ссли Ρ‚ΠΈΠΏ получится свСсти Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Ρ‚ΠΈΠΏΡƒ A.

<?php

function foo(): int|INT {} // Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ
function foo(): bool|false {} // Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ
function foo(): int&Traversable {} // Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ
function foo(): self&Traversable {} // Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ

use A as B;
function
foo(): A|B {} // Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ "use" Ρ‚ΠΎΠ»ΡŒΠΊΠΎ создаёт псСвдоним Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠΌΡ‘Π½, Π° Π½Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ)
function foo(): A&B {} // Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ "use" Ρ‚ΠΎΠ»ΡŒΠΊΠΎ создаёт псСвдоним Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠΌΡ‘Π½, Π° Π½Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ)

class_alias('X', 'Y');
function
foo(): X|Y {} // Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ (ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ обнаруТится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π°)
function foo(): X&Y {} // Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ (ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ обнаруТится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π°)

?>

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #3 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ объявлСния Ρ‚ΠΈΠΏΠ° Ρ‡Π΅Ρ€Π΅Π· Π½Π°Π·Π²Π°Π½ΠΈΠ΅ класса

<?php

class C {}
class
D extends C {}

// Класс Π½Π΅ наслСдуСт класс C
class E {}

function
f(C $c)
{
echo
get_class($c)."\n";
}

f(new C);
f(new D);
f(new E);

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² PHP 8:

C
D

Fatal error: Uncaught TypeError: f(): Argument #1 ($c) must be of type C, E given, called in /in/gLonb on line 14 and defined in /in/gLonb:8
Stack trace:
#0 -(14): f(Object(E))
#1 {main}
  thrown in - on line 8

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #4 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ объявлСния Ρ‚ΠΈΠΏΠ° Ρ‡Π΅Ρ€Π΅Π· Π½Π°Π·Π²Π°Π½ΠΈΠ΅ интСрфСйса

<?php

interface I
{
public function
f();
}

class
C implements I
{
public function
f() {}
}

// Класс Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс I
class E {}

function
f(I $i)
{
echo
get_class($i) . "\n";
}

f(new C);
f(new E);

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² PHP 8:

C

Fatal error: Uncaught TypeError: f(): Argument #1 ($i) must be of type I, E given, called in - on line 13 and defined in -:8
Stack trace:
#0 -(13): f(Object(E))
#1 {main}
  thrown in - on line 8

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #5 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ объявлСния Ρ‚ΠΈΠΏΠ° значСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°

<?php

function sum($a, $b): float
{
return
$a + $b;
}

// ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ функция Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с Ρ‚ΠΈΠΏΠΎΠΌ float
var_dump(sum(1, 2));

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

float(3)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #6 Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

<?php

class C {}

function
getC(): C
{
return new
C();
}

var_dump(getC());

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

object(C)#1 (0) {
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #7 ОбъявлСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° с обнуляСмым Ρ‚ΠΈΠΏΠΎΠΌ

<?php

class C {}

function
f(?C $c)
{
var_dump($c);
}

f(new C());
f(null);

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

object(C)#1 (0) {
}
NULL

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #8 ОбъявлСниС Ρ‚ΠΈΠΏΠ° значСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°ΠΊ обнуляСмого

<?php

function get_item(): ?string
{
if (isset(
$_GET['item'])) {
return
$_GET['item'];
} else {
return
null;
}
}

?>

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #9 ОбъявлСниС Ρ‚ΠΈΠΏΠ° свойства класса

<?php

class User
{
public static
string $foo = 'foo';

public
int $id;
public
string $username;

public function
__construct(int $id, string $username)
{
$this->id = $id;
$this->username = $username;
}
}

?>

Бтрогая типизация

Π’ нСстрогом Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, PHP ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ значСния Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² скалярный Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Π»ΠΈ Π² объявлСнии, поэтому, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с Ρ‚ΠΈΠΏΠΎΠΌ string Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° с Ρ‚ΠΈΠΏΠΎΠΌ int функция ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с Ρ‚ΠΈΠΏΠΎΠΌ string.

Π‘Ρ‚Ρ€ΠΎΠ³ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Π’ строгом Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΈΠ·Π½Π°Ρ‘Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΈΠΏΡƒ объявлСния, ΠΈΠ½Π°Ρ‡Π΅ выбрасываСтся ошибка TypeError. ЕдинствСнноС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ»Π° β€” значСния с Ρ‚ΠΈΠΏΠΎΠΌ int, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ Π² объявлСния Ρ‚ΠΈΠΏΠ° float.

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

ОбъявлСниС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ strict_types Π½Π΅ влияСт Π½Π° Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π‘Ρ‚Ρ€ΠΎΠ³ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ инструкциСй declare с объявлСниСм Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ strict_types:

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

На ΡΡ‚Ρ€ΠΎΠ³ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ влияСт Ρ€Π΅ΠΆΠΈΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ объявили Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»Π° Π²Ρ‹Π·ΠΎΠ²Π°, Π° Π½Π΅ Ρ€Π΅ΠΆΠΈΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ установили Π² Ρ„Π°ΠΉΠ»Π΅ объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ Ρ€Π΅ΠΆΠΈΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ установили Π½Π° сторонС Π²Ρ‹Π·ΠΎΠ²Π°, ΠΈ автоматичСски ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ Ρ‚ΠΈΠΏΡ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ссли Ρ„Π°ΠΉΠ» Π±Π΅Π· строгой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ объявили Π² Ρ„Π°ΠΉΠ»Π΅ со строгой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

Бтрогая типизация опрСдСляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для объявлСний скалярных Ρ‚ΠΈΠΏΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #10 Бтрогая типизация для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²

<?php

declare(strict_types=1);

function
sum(int $a, int $b)
{
return
$a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1.5, 2.5));

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² PHP 8:

int(3)

Fatal error: Uncaught TypeError: sum(): Argument #1 ($a) must be of type int, float given, called in - on line 9 and defined in -:4
Stack trace:
#0 -(9): sum(1.5, 2.5)
#1 {main}
  thrown in - on line 4

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #11 ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²

<?php

function sum(int $a, int $b)
{
return
$a + $b;
}

var_dump(sum(1, 2));

// ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ значСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊ Ρ†Π΅Π»Ρ‹ΠΌ числам: ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π²Ρ‹Π²ΠΎΠ΄!
var_dump(sum(1.5, 2.5));

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

int(3)
int(3)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #12 Бтрогая типизация для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°

<?php

declare(strict_types=1);

function
sum($a, $b): int
{
return
$a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1, 2.5));

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

int(3)

Fatal error: Uncaught TypeError: sum(): Return value must be of type int, float returned in -:5
Stack trace:
#0 -(9): sum(1, 2.5)
#1 {main}
  thrown in - on line 5
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 3 notes

up
26
toinenkayt (ta at ta) [iwonderr] gmail d ΒΆ
4 years ago
While waiting for native support for typed arrays, here are a couple of alternative ways to ensure strong typing of arrays by abusing variadic functions. The performance of these methods is a mystery to the writer and so the responsibility of benchmarking them falls unto the reader.

PHP 5.6 added the splat operator (...) which is used to unpack arrays to be used as function arguments. PHP 7.0 added scalar type hints. Latter versions of PHP have further improved the type system. With these additions and improvements, it is possible to have a decent support for typed arrays.

<?php
declare (strict_types=1);

function typeArrayNullInt(?int ...$arg): void {
}

function doSomething(array $ints): void {
    (function (?int ...$arg) {})(...$ints);
    // Alternatively, 
    (fn (?int ...$arg) => $arg)(...$ints);
    // Or to avoid cluttering memory with too many closures
    typeArrayNullInt(...$ints);

    /* ... */
}

function doSomethingElse(?int ...$ints): void {
    /* ... */
}

$ints = [1,2,3,4,null];
doSomething ($ints);
doSomethingElse (...$ints);
?>

Both methods work with all type declarations. The key idea here is to have the functions throw a runtime error if they encounter a typing violation. The typing method used in doSomethingElse is cleaner of the two but it disallows having any other parameters after the variadic parameter. It also requires the call site to be aware of this typing implementation and unpack the array. The method used in doSomething is messier but it does not require the call site to be aware of the typing method as the unpacking is performed within the function. It is also less ambiguous as the doSomethingElse would also accept n individual parameters where as doSomething only accepts an array. doSomething's method is also easier to strip away if native typed array support is ever added to PHP. Both of these methods only work for input parameters. An array return value type check would need to take place at the call site.

If strict_types is not enabled, it may be desirable to return the coerced scalar values from the type check function (e.g. floats and strings become integers) to ensure proper typing.
up
16
crash ΒΆ
4 years ago
The documentation lacks the information, that it's possible to change the return type of a method defined in an interface when the interface's methods return type is defined as `mixed`.

From the RFC:

"The mixed return type could be narrowed in a subclass as this is covariant and is allowed in LSP." (https://wiki.php.net/rfc/mixed_type_v2)

This means the following code is valid in PHP 8.0:

<?php

interface ITest
{
    public function apfel(): mixed; // valid as of 8.0
}

class Test implements ITest
{
    public function apfel(): array // more explicit
    {
        return [];
    }
}

var_dump((new Test())->apfel());
?>

You can see the result here: https://3v4l.org/PXDB6
up
4
harl at gmail dot com ΒΆ
1 year ago
For DNF type declarations (which lack an example), they're a mix of intersection and union types that look like this:
<?php

function send(c1|(c2&c3) $f) {}

?>

It's a union type where some of its options are intersection types, which are wrapped in parentheses ($f is something that is either a c1, or something that is both a c2 and a c3).