Подтвердить что ты не робот

(Когда) следует использовать тип намека на PHP?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

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

Во многих случаях также исключается тестирование исключений из-за проблем с версией стека (например, некоторые версии PHP, такие как 5.4, не улавливают "захватывающие фатальные" ошибки надлежащим образом, а ergo phpunit просто умирает, разбивая тестовые комплекты. проблема, однако в моем опыте тип намека просто лишний, заставляет людей, которые привыкли к типизированному языку, лучше воспринимать PHP, не осознавая этого, и вызывает гораздо более сложные сценарии тестирования (очень сложно проверить, как вызывающие пользователи обрабатывают результаты пути исключения).

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

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