PHP: substr(string $string, int $offset, ?int $length = null): string https://www.php.net/manual/ru/function.substr.php
@Phantorm, подробнее: https://www.php.net/manual/ru/language.types.declarations.php Про ? - в разделе "Обнуляемые типы".
В ДАННОМ СЛУЧАЕ это обозначает не обязятельный параметр (т.е. фнкция будет работать и без него) Посмотрите пример по ссылке: https://phpize.online/sql/mysql57/undefined/php/php81/4d6b13417c243c21e0dbaaa1f595fc1d/
@Slava Rozhnev, на «необязательный параметр» указывает наличие дефолтного значения, а не вопросительный знак.
Не обязательность параметра обозначает присваивание ему значения, в данном случае null, а вопросительный знак у типа означает, что возможно null значение у этого параметра, если убрать ? в ?int $length = null, то будет ошибка, надо тогда будет присваивать числовое значение, например: int $length = 0.