если return отсутсвует // работает с return; // не работает если return null; // не работает если return 123; } function callMethod (?Bar $bar): ? Bar {} $this->callMethod($bar); // Работает $this->callMethod( null); // Работает $this->callMethod(); // НЕ работает function callMethod (int $bar = null) {} $this->callMethod( 1); // Работает $this->callMethod( null); // Работает $this->callMethod(); // Тоже работает function callMethod (?Bar $bar = null) {} // Работает так же как и без “?” interface Fooable { function foo(int $i): ? Fooable; } interface StrictFooable extends Fooable { function foo(?int $i): Fooable; // valid } В наследнике можно делать «строже» возвращаемый тип (то есть запрещать nullable), а параметр наоборот расширять до nullable, НО не наоборот! class Token { // Константа без модификатора по умолчанию “public” const PUBLIC_CONST = 0; // Константы с различной областью видимости private const PRIVATE_CONST = 0; protected const PROTECTED_CONST = 0; public const PUBLIC_CONST_TWO = 0; // Весь список имеет одну область видимости private const FOO = 1, BAR = 2; } try { echo "OK"; } catch (Exception | DomainException $e) { // ... обработка 2ух типов исключений сразу } catch (TypeError $e) { // ... }