(Когда) я должен использовать подсказки типа в PHP? - PullRequest
23 голосов
/ 11 февраля 2009

Я не могу понять мотивацию авторов PHP, чтобы добавить тип подсказки. Я счастливо жил до того, как это появилось. Затем, как это было добавлено в PHP 5, я начал указывать типы везде. Теперь я думаю, что это плохая идея, так как типизация утки гарантирует минимальную связь между классами и использует модульность и повторное использование кода.

Такое ощущение, что подсказки типа разбивают язык на 2 диалекта: некоторые люди пишут код в стиле статического языка с подсказками, а другие придерживаются старой доброй динамической языковой модели. Или это не ситуация "все или ничего"? Должен ли я как-то смешать эти два стиля, когда это уместно?

Ответы [ 6 ]

35 голосов
/ 11 февраля 2009

Речь идет не о статической, а о динамической типизации, php все еще динамичен. Речь идет о контрактах на интерфейсы. Если вы знаете, что функция требует наличия массива в качестве одного из своих параметров, принудительно вставьте его в определение функции. Я предпочитаю быстро терпеть неудачу, а не ошибаться позже в функции.

(Также обратите внимание, что вы не можете указать тип подсказки для bool, int, string, float, что имеет смысл в динамическом контексте.)

16 голосов
/ 11 февраля 2009

Вы должны использовать подсказки типов, когда код в вашей функции определенно зависит от типа переданного параметра. В любом случае код выдаст ошибку, но подсказка типа даст вам лучшее сообщение об ошибке.

12 голосов
/ 11 февраля 2009

Мотивация группы PHP добавить подсказку о типе состояла в том, чтобы предоставить людям, использующим ООП в стиле Java, еще одну функцию, которая сделает платформу более знакомой, удобной и привлекательной. Это, в свою очередь, сделает PHP более «готовым для предприятия», что поможет Zend в их основной деятельности.

Маркетинг в стороне, у него есть свои применения. Если вы пишете метод, который работает с параметром особым образом, который может привести к непреднамеренным (часто молчаливым) сбоям, если параметр был чем-то другим, то использование подсказок по типу гарантирует, что код будет ломаться во время разработки, а не в работе.

5 голосов
/ 11 февраля 2009

Если вы когда-нибудь решите использовать хинтинг типа, сделайте это, используя интерфейсы вместо конкретных или абстрактных классов. Причина проста: PHP не разрешает множественное наследование, но позволяет реализовать несколько интерфейсов. Поэтому, если кто-то попытается использовать вашу библиотеку, у него не будет проблем с реализацией вашего интерфейса, в отличие от случая, когда ему придется расширять ваш абстрактный / конкретный класс, учитывая, что он уже расширяет другой класс.

0 голосов
/ 21 июля 2016

Тип подсказок является предметом споров в нашей компании (в основном это нравится людям на Java), и я очень программист PHP старой школы (и программирую на других языках).

Мой совет - избегать подсказок типа и включать обработчики try / catch в каждую сложную функцию.

Тип подсказки заставляет приложение полагаться на среду обработки исключений вызывающей стороны, которая в общем плохая и остается непроверенной, что является основной проблемой. Для веб-приложений это приводит к «белому экрану смерти», а для пакета это приводит к просто фатальному выходу без регистрации хороших сообщений в большинстве случаев, и вы сидите, покачиваете голову, пытаясь воссоздать проблему пользователя или приложения, которая лежит на вашем управлении. вернуться к решению.

Локальная обработка исключений обеспечивает более контролируемый сценарий тестирования, включая мусор в типах данных и мусор в значениях данных, что дает гораздо более полный набор тестов по сравнению с трудным для тестирования путем обработки исключений в вызывающей стороне, передавая неверный тип и ожидая исключения.

Тестирование исключений также во многих случаях дает сбой из-за проблем версий стека (т. Е. Некоторые версии PHP, такие как 5.4, не отлавливают «подхватывающие фатальные» ошибки надлежащим образом, а ergo phpunit просто умирает, нарушая комплекты тестирования. Это зависит от стека) Однако, по моему опыту, подсказки по типу просто не нужны, заставляют людей, привыкших к типизированному языку, лучше воспринимать PHP, не осознавая последствий, и приводят к гораздо более сложным сценариям тестирования (очень сложно тестировать вызывающих, обрабатывающих результаты пути исключения).

Java и другие типизированные пользователи языка не принимают или не понимают, как использовать и использовать параметры по умолчанию смешанного типа в PHP ... Они будут учиться когда-нибудь, но только если они пойдут по пути PHP. ;-)

Лучшие уроки извлекаются при разработке надежных сценариев тестирования на основе модулей PHP, и это, как правило, проливает свет на то, почему подсказки по типу являются проблемой в тестировании и вызывают гораздо больше проблем, чем пользы ... Каждому свое и мои приложения работают лучше и надежнее, а тестирование получается гораздо более полным, как правило, со 100% покрытием кода, включая пути перехвата в локальных функциях.

0 голосов
/ 11 февраля 2009

Без подсказок о типах для IDE было бы невозможно узнать тип параметра метода и, таким образом, обеспечить правильный смысл - ваш редактор действительно имеет смысл, верно? ;). Надо сказать, что я просто предполагаю, что IDE используют это для intellisense, так как это первый раз, когда я слышал о подсказках типа в PHP (спасибо за подсказку, кстати).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...