Типы PHP до аргументов функции, хорошие или плохие?

есть ли преимущество в предоставлении типов аргументов:

public static function DoStuff( string $str ) {
    echo $str;
}

по сравнению с не использующими их?

public static function DoStuff( $str ) {
    echo $str;
}

Может ли он работать быстрее, если я объявляю свои типы?

Ответ 1

Вы не можете (с текущими версиями PHP) указать скалярные типы, такие как строка или int. Вы можете указать только класс/интерфейс или массив.

Соответствующая страница руководства: Type Hinting.


Я вижу, по крайней мере, одно большое преимущество использования типа hinting: удобочитаемость. Легче видеть, какой параметр ожидает функция/метод.

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

  • Я лично считаю, что это заставляет разработчика больше уважать ваши интерфейсы
  • Это позволяет вашему коду просто работать с полученными параметрами.
  • Сгенерированная ошибка


Если ваш вопрос о скорости:

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


В заключение, личное мнение: я довольно часто использую эти намеки типа, именно так:

  • Люди, использующие мой код, знают, что они должны пройти (они не всегда читают документацию...)
  • Если они не делают того, что ожидается, это терпит неудачу; жесткий; в какой-то мере они сразу замечают
  • Мой код не должен проверять, имеет ли принятый параметр правильный тип: я знаю, что это так, как это делает PHP для меня.

Ответ 2

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

Ответ 3

Преимущество заключается в том, что вы сразу получите ошибку, если кто-то попытается использовать вашу функцию неправильно (например, используя один класс вместо другого ИЛИ не используя массив, когда они должны).

Однако вы не можете сделать это ни с чем, кроме объектов или массивов, поэтому ваш пример со строкой не будет работать.

Он будет почти определенно работать медленнее, так как будет проведено больше проверок.

Ответ 4

Три преимущества для меня на php:

  1. Код становится более самоописательным
  2. Полезно, когда вам нужны строгие проверки, такие как проверка количества или не заданных значений.
  3. Ограничивает использование переменных, показывая нетерминальные ошибки php, сообщающие вам, что вы используете неправильные значения переменных.

Я не уверен, улучшена ли производительность с помощью типов.