Неправильно называть это «типовой намек». «Подсказка» подразумевает, что это некоторая необязательная типизация, просто подсказка, а не требование, однако параметры типизированной функции вообще не являются обязательными - если вы укажете неправильный тип, вы получите фатальную ошибку. Назвать это «типовой намек» было ошибкой.
Теперь о причинах, по которым в PHP нет примитивной типизации для параметров функции. PHP не имеет барьера между примитивными типами - то есть, строка, целое число, число с плавающей запятой, bool - более или менее взаимозаменяемы, вы можете иметь $a = "1";
, а затем echo $a+3;
и получить 4
. Все внутренние функции также работают таким образом - если функция ожидает строку и вы передаете целое число, она преобразуется в строку, если функция ожидает число с плавающей запятой и получает целое число, она преобразуется в число с плавающей запятой и т. Д. Это отличается от типов объектов - нет никакого преобразования, скажем, между SimpleXMLElement
и DirectoryIterator
- и не может быть, это не имеет никакого смысла.
Таким образом, если вы вводите функцию, которая принимает целое число 1
, а не строку 1
, вы создаете несовместимость между внутренними функциями и пользовательскими функциями и создаете проблемы для любого кода, который предполагает, что они в значительной степени совпадают. Это было бы большим изменением в поведении программ PHP, и это изменение необходимо будет распространить по всему коду с использованием таких функций - так как в противном случае вы рискуете получить ошибки при переходе между «строгим» и «нестрогим» кодом. Это подразумевает необходимость переменных типов, типизированных свойств, типизированных возвращаемых значений и т. Д. - большие изменения. А поскольку PHP не является скомпилированным языком, вы не получаете преимуществ от статического контроля типов с его недостатками - вы получаете только неудобства, но не дополнительную безопасность. По этой причине типизация параметров не принимается в PHP.
Существует еще одна опция - принудительная типизация, то есть поведение, аналогичное тому, что делают внутренние функции, - преобразование между типами. К сожалению, этот не удовлетворяет сторонников строгой типизации, и, таким образом, до сих пор нет консенсуса, и, таким образом, его нет.
С другой стороны, типы объектов никогда не были противоречивыми - ясно, что между ними нет преобразования, нет кода, предполагающего, что они являются взаимозаменяемыми, и проверки могут быть только строгими для них, и это относится как к внутренним, так и к внешним функциям. , Таким образом, введение строгих типов объектов не было проблемой.