Я использую php 8.0, но по какой-то причине типы объединения и типы с нулевым значением, похоже, не работают в соответствии с документацией. ?Type или Type|null должны сделать аргумент необязательным в соответствии с документацией (https://www.php.net/manual/en/language.types.declarations.php#language.types.declarations.union)
Но я получаю исключение.
8.0.0
PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 1 passed in /var/www/test/test.php on line 10 and exactly 2 expected in /var/www/test/test.php:4
Stack trace:
#0 /var/www/test/test.php(10): test()
#1 {main}
thrown in /var/www/test/test.php on line 4
Простой тестовый код
//function test(string $hello, ?string $world) {
function test(string $hello, string|null $world) {
return $hello . ' ' . ($world ?? 'world');
}
echo phpversion() . PHP_EOL;
// Outputs 8.0.0
echo test('hello') . PHP_EOL;
// Expected output: hello world
echo test('hola','mundo');
// Expected output: hola mundo
Что здесь не так?






Использование string|null в качестве подсказки типа в PHP 8 не означает, что аргумент является необязательным, просто он может принимать значение NULL. Это означает, что вы можете передать null как значение (или строку, очевидно), но аргумент по-прежнему требуется.
Если вы хотите, чтобы аргумент был необязательным, вам необходимо указать значение по умолчанию, как показано ниже:
function test(string $hello, string|null $world = null) {
// ...
}
Смотрите https://3v4l.org/gXLDH
То же самое было и в более ранних версиях PHP, использующих синтаксис ?string; аргумент по-прежнему требовался, но значение null было допустимым.