1--TEST-- 2Scalar type nullability 3--FILE-- 4<?php 5 6$errnames = [ 7 E_NOTICE => 'E_NOTICE', 8 E_WARNING => 'E_WARNING', 9 E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR' 10]; 11set_error_handler(function (int $errno, string $errmsg, string $file, int $line) use ($errnames) { 12 echo "$errnames[$errno]: $errmsg on line $line\n"; 13 return true; 14}); 15 16$functions = [ 17 'int' => function (int $i) { return $i; }, 18 'float' => function (float $f) { return $f; }, 19 'string' => function (string $s) { return $s; }, 20 'bool' => function (bool $b) { return $b; }, 21 'int nullable' => function (int $i = NULL) { return $i; }, 22 'float nullable' => function (float $f = NULL) { return $f; }, 23 'string nullable' => function (string $s = NULL) { return $s; }, 24 'bool nullable' => function (bool $b = NULL) { return $b; } 25]; 26 27foreach ($functions as $type => $function) { 28 echo "Testing $type:", PHP_EOL; 29 try { 30 var_dump($function(null)); 31 } catch (TypeError $e) { 32 echo "*** Caught " . $e->getMessage() . PHP_EOL; 33 } 34} 35 36echo PHP_EOL . "Done"; 37?> 38--EXPECTF-- 39Testing int: 40*** Caught Argument 1 passed to {closure}() must be of the type integer, null given, called in %s on line %d 41Testing float: 42*** Caught Argument 1 passed to {closure}() must be of the type float, null given, called in %s on line %d 43Testing string: 44*** Caught Argument 1 passed to {closure}() must be of the type string, null given, called in %s on line %d 45Testing bool: 46*** Caught Argument 1 passed to {closure}() must be of the type boolean, null given, called in %s on line %d 47Testing int nullable: 48NULL 49Testing float nullable: 50NULL 51Testing string nullable: 52NULL 53Testing bool nullable: 54NULL 55 56Done 57