Использование статических анализаторов существенно повышает качество кода, но при использовании их в библиотеках нужно учитывать один важный нюанс — нельзя доверять типу входящих данных.
В приложении мы можем использовать расширенную типизацию (в случае PHP и Psalm — с помощью аннотаций) для параметров функций, методов, конструкторов классов и быть уверенными, что параметры будут ожидаемых типов (конечно же если не забываем запускать статический анализ, а ещё лучше настроили его в CI).
Например, у нас есть класс, который в конструкторе ожидает массив из объектов и мы указываем это в аннотации:
final class Test {
/**
* @param object[] $objects
*/
public function __construct(array $objects) {
// ...
}
}
При попытке создать объект с аргументами, которые соответствуют типизации языка, но не соответствуют расширенной типизации (например, new Test([1, 2]);), анализатор выдаст ошибку.Но если тот же самый класс мы решим вынести в библиотеку, то у нас сразу исчезает уверенность, что параметр
$objects будет именно массивом объектов. Разработчики, использующие нашу библиотеку:• могут не использовать статические анализаторы,
• могут использовать другой анализатор.
А это значит, что ошибка будет обнаружена, возможно, не сразу и совсем в другом месте, так как код библиотеки будет работать неожиданным образом.
❗️В библиотеках все входящие параметры нужно проверять и не полагаться на статический анализ.