Verification: a143cc29221c9be0

Passing arrays as arguments in php

Типизация в PHP

В языке PHP динамическая типизация. Это значит, что при инициализации переменной ей нельзя назначить тип. Тип переменной выставиться динамически в зависимости от значения (или результат выполнения выражения), которое ей присваивается. Он может меняться в процессе выполнения скрипта. Продемонстрирую на примере:

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

Типизация аргументов в функциях и методах

В последних версиях PHP появился возможность указывать типы для аргументов функций и возвращаемого ею значения. Рассмотрим эти возможности на примере:

Код содержит функцию с 3 аргументами различных типов. Типы указываются перед именем аргумента, а тип возращаемого значения после двоеточия.

Обратите внимание на строку «declare(strict_types=1);» Она включает строгую типизацию. Например, если при строгой типизации мы передадим в первый аргумент функции строку вместо числа, то получим ошибку:

TypeError: Argument 1 passed to myTestOperation() must be of the type int, string given

Если удалить строчку declare(strict_types=1), PHP попытается преобразовать переданную строку в число. Если преобразовать невозможно, PHP выбросит исключение TypeError.

Типы аргументов и тип возвращаемого значения могу быть следующими:

  • int - целочисленный тип;
  • float - числа с плавающей точкой (десятичная дробь);
  • string - строка;
  • array - массив;
  • callback - Callback-функция;
  • имя класса - в качестве аргумента должен передаваться экземпляр класса;
  • интерфейс - в качестве аргумета должен передаваться класс, имплементирующий (реализующий) данный интерфейс.

Null и void в сигнатуре функции

В случае, если функция или метод класса не возвращают значение, после двоеточия пишется ключевое слово void.

function myAction(): void 
{
    // ...
    // В функции не должно быть return
}

В случае, если какие-то из аргументов функции мы захотим сделать необязательными, на нужно добавить знак ? перед именем типа. Это правило работает и для возвращаемого значения. Например, для аргумента ?int $myVar можно передать значение либо null, либо целое число. Чтобы явно не передавать null в качестве значения необязательного аргумента, обычно в сигнатуре присваивают значение по умолчанию, как показано в следующем примере:

function myTestOperation(int $firstParam, ?string $secondParam = null, ?array $thirdParam = null): ?float
{
    var_dump($firstParam); // выведет int(6)
    var_dump($secondParam); // выведет NULL
    var_dump($thirdParam); // выведет NULL

    return null; // Можно венруть null, так как в сигнатуре ?float (либо десятичная дробь, либо null)
}

// Вызываем функцию
// Явно передаем null во 2 и 3 аргументы
myTestOperation(6, null, null);

// Вызываем еще раз
// При этом не передаем необязательные аргуметы, так как в сигнатуре присвоены дефолтные значения
// При этом результат выполнения будет идентичен
myTestOperation(6);

Преимущества указания типов в PHP

Использование типов и строгой типизации дает на следующие преимущества:

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