Pull to refresh

PHP type hinting — строгое или мягкое?

Reading time2 min
Views23K
Добрый день, %username%!

Сегодня мне хотелось бы обсудить тему type hinting в PHP. В данный момент в листе рассылки для разработчиков идёт жаркая дискуссия на эту тему и обсуждается какой подход нужно использовать и как это будет работать. Ваш покорный слуга тоже активно участвует в этой дискуссии.

Дискусию можно начать читать здесь и продвигается по ней кликая на next in thread.



Обсуждается два основных варианта имплементации — строгое типизирование и мягкое.
  • Строгое типизирование — это проверка типа переменной при передачи параметра функции. Любое несоотвествие приводит к ошибке или notice
  • Мягкое типизирование — это проверка как по типу (запрет передачи array вместо integer), так и возможность автоматической конвертации определённых типов (об этом подробнее дальше).


Лично я поддерживаю второй вариант. И вот почему.

Во первых, этот вариант поддерживает автоматические трансляции вида integer => float, float => string, string -> float, string => integer. Вы скажете, а как же «123abc» => int => 123!? В этом случае будет ошибка. А нужно это для того, что бы не приходилось заниматся ручной конвертацией типов каждый раз, когда мы что-то выбираем из базы данных. Согласитесь, каждый раз явно конвертировать ID записи к int — это писать очень и очень много дополнительного кода (кто не в курсе, большинство библиотек для работы с базами в PHP все данные отдают в виде строк, не зависимо от того, что за тип колонки в базе данных). И именно поетому лично я против строгого типизирования — оно принесёт больше проблем чем пользы. Да и пользоватся им будет весьма сложно из-за самой природы PHP.

В общем случае механизм работы предпологается такой:
  • «11» превращается в integer и float
  • 11 превращается в string и float
  • 11.1 превращается в string, float — ошибка.
  • «11.1» превращается в float, integer — ошибка
  • «11acd» — ошибка как для integer так и float
  • Для bool хинта все значения превращаются в true/false по традиционным правилам PHP
  • Конвертация из простых типов (bool, int, float, string) в array или object и наоборот всегда выдаёт ошибку.
  • Type hinting массивов и объектов остаётся таким, какой он есть сейчас


В общем если вам есть что сказать — подписывайтесь на лист рассылки php-internals и пишите в него. Если вам это делать лень — могу отправить сообщение за вас.

А что думаешь по этому поводу ты, %username%? За какой подход голосуешь ты?

UPD1: Итог дискуссии я подведу в общем топике и отошлю его в internals mailing list. Так что у вас есть возможность высказать мнение как русского PHP comunity.
Tags:
Hubs:
Total votes 44: ↑28 and ↓16+12
Comments167

Articles