Я не могу понять мотивацию авторов PHP, чтобы добавить тип намека. Я счастливо жил, пока не появился. Затем, поскольку он был добавлен в PHP 5, я начал задавать типы везде. Теперь я думаю, что это плохая идея, поскольку утиная типизация обеспечивает минимальную связь между классами и использует модульную модульность и повторное использование кода.
Похоже, что подсказки типа разделяют язык на 2 диалекта: некоторые люди пишут код в статическом стиле, с подсказками, а другие придерживаются старой старой динамической модели языка. Или это не «все или ничего»? Должен ли я каким-то образом смешивать эти два стиля, когда это необходимо?
Речь идет не о статическом и динамическом типировании, php все еще динамичен. Речь идет о контрактах для интерфейсов. Если вы знаете, что функция требует, чтобы массив был одним из его параметров, заставьте его прямо там в определении функции. Я предпочитаю сбой быстро, а не ошибку позже в функции.
(Также обратите внимание, что вы не можете указать тип hinting для bool, int, string, float, что имеет смысл в динамическом контексте.)
Вы должны использовать подсказки типа всякий раз, когда код в вашей функции определенно зависит от типа переданного параметра. В любом случае код будет генерировать ошибку, но подсказка типа даст вам лучшее сообщение об ошибке.
Мотивация группы PHP для добавления типа намека заключалась в том, чтобы предоставить людям, используемым в ООП в стиле Java, еще одну функцию, которая сделает платформу более знакомой, удобной и привлекательной. Это, в свою очередь, сделает PHP более «готовым к работе», что поможет Zend в их основном бизнесе.
Маркетинг в стороне, у него есть свои возможности. Если вы пишете метод, который работает с параметром определенным образом, что может привести к непреднамеренным (часто молчащим) сбоям, если параметр был чем-то другим, то использование типа подсказки гарантирует, что код будет нарушаться во время разработки, а не прерывать производство.
Если вы когда-нибудь решите сделать намек типа, по крайней мере, сделать это, используя интерфейсы вместо конкретных или абстрактных классов. Причина проста, PHP не допускает множественного наследования, но позволяет реализовать несколько интерфейсов. Поэтому, если кто-то попытается использовать вашу библиотеку, у него не будет трудностей с реализацией вашего интерфейса, в отличие от случая, когда он должен будет расширить ваш абстрактный / конкретный класс, учитывая, что он уже расширяет другой.
Без подсказки типа для IDE было бы невозможно узнать тип параметра метода и, таким образом, обеспечить надлежащую intellisense – у вашего редактора есть intellisense, правильно? ;). Надо сказать, что я просто предполагаю, что IDE используют это для intellisense, так как это первое, что я слышал о типе, намекающем на PHP (спасибо за подсказку btw).
Тип hinting – это дебаты в нашей компании (в основном это люди Java), и я очень старый программист PHP (и программа на других языках).
Мой совет состоит в том, чтобы избежать намека типов и включения обработчиков try / catch в каждую сложную функцию.
Тип hinting заставляет приложение полагаться на среду обработки исключений вызывающих лиц, которая в целом плохая и не тестируется, основная проблема. Для веб-приложений это приводит к белым экранам смерти, для партии это приводит к простому фатальному выходу без значительных сообщений в большинстве случаев, и вы сидите, царапая голову, пытаясь воссоздать проблему с пользователем или приложением, вернуться к разрешению.
Локальная обработка исключений обеспечивает более контролируемый сценарий тестирования, включая мусор в типах данных и мусор в значениях данных, что дает гораздо более полный набор тестов по сравнению с трудным для проверки пути обработки исключений в вызывающем, передавая неправильный тип и ожидая исключение.
Экзаменное тестирование также не выполняется во многих случаях из-за проблем с версией стека (например, некоторые версии PHP, такие как 5.4, не улавливают «уловимые фатальные» ошибки надлежащим образом, а ergo phpunit просто умирает от тестирования наборов тестов. в моем опыте тип намека просто не нужен, заставляет людей, которые привыкли к типизированному языку, лучше воспринимать PHP, не осознавая этого, и вызывает гораздо более сложные сценарии тестирования (очень сложно проверить, как вызывающие пользователи обрабатывают результаты пути исключения).
Java и другие типизированные люди языка не принимают или не понимают, как использовать и использовать смешанные параметры по умолчанию в PHP … Они узнают когда-нибудь, но только в том случае, если они охватывают путь PHP. 😉
Лучшие уроки изучаются при разработке надежных сценариев тестирования на основе PHP-модулей, и это, как правило, проливает свет на то, почему тип намека – это боль в прикладе, связанная с тестированием, и вызывает гораздо больше проблем, чем пользы … Каждому свое и мое приложения работают лучше и надежнее, и тестирование получило гораздо более полное покрытие на 100% кода, включая пути catch в локальных функциях.