Php тип переменной функция

Типизация аргументов и свойств в PHP 7 и 8

С каждой версией язык php обрастает новыми возможностями, делая жизнь разработчиков проще. В этой статье мы обсудим возможности типизации в современных версиях PHP и преимущества использования типов.

Типизация в PHP

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

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

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

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

 // Вызываем функцию myTestOperation(123, 'test', [4, 5, 6]);

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

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

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

Читайте также:  Python HTML app Hello World

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

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

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

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

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

В случае, если какие-то из аргументов функции мы захотим сделать необязательными, на нужно добавить знак ? перед именем типа. Это правило работает и для возвращаемого значения. Например, для аргумента ?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

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

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

Типизация свойств объекта в PHP 7.4

В PHP версии 7.4 появилась возможность указывать типы в классах.

Источник

Php тип переменной функция

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

function isPositive($number) < return $number >0; > $result = isPositive("-Youdontknowwhoiam"); if($result) echo "положительное"; else echo "отрицательное или равно нулю";

В данном случае функция isPositive() очевидно ожидает, что в качестве параметра будет передано число, чтобы установить, больше оно нуля или нет. Тем не менее при вызове функции мы можем передать в нее произвольное значение. Чтобы оградиться от подобным ситуаций необходимо явным образом указать, что функция может принимать только число, то есть типизировать параметр функции.

Определение типа

Какие определения типов могут использоваться при типизации:

  • bool : допустимые значения true и false
  • float : значение должно число с плавающей точкой
  • int : значение должно представлять целое число
  • string : значение должно представлять строку
  • mixed : любое значение
  • callable : значение должно представлять функцию
  • array : значение должно представлять массив
  • iterable : значение должно представлять массив или класс, который реализует интерфейс Traversable . Применяется при переборе в цикле foreach
  • Имя класса: объект должен представлять данный класс или его производные классы
  • Имя интерфейса: объект должен представлять класс, который реализует данный интерфейс
  • Self : объект должен представлять тот же класс или его производный класс. Может использоваться только внутри класса.
  • parent : объект должен представлять родительский класс данного класса. Может использоваться только внутри класса.

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

При типизации параметров тип указывается перед названием параметра:

function isPositive(int $number) < return $number >0; > $result1 = isPositive(25); // норм - 25 число $result2 = isPositive("25"); // норм - PHP может преобразовать значение в число $result3 = isPositive("-Youdontknowwhoiam"); // Ошибка TypeError

В данном случае параметр $number должен представлять тип int , то есть целое число. Поэтому при вызове функции мы должны передать в функцию целочисленное значение. Если будет передано значение другого типа, то PHP попытается преобразовать значение. В некоторых случаях такое преобразование можно завершится успешно:

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

$result3 = isPositive("-Youdontknowwhoiam");
function sum(array $numbers, callable $condition) < $result = 0; foreach($numbers as $number)< if($condition($number)) < $result += $number; >> return $result; > $isPositive = function($n) < return $n >0;>; $myNumbers = [-2, -1, 0, 1, 2, 3, 4, 5]; $positiveSum = sum($myNumbers, $isPositive); echo $positiveSum; // 15

В данном случае параметры функции должный представлять массив и другую функцию (тип callable ). В качестве функции можно передать анонимную функцию.

Типизация возвращаемого значения

Для установки типа возвращаемого из функции значения после списка параметров указывается двоеточие : и после него тип данных:

function isPositive (int $number) : bool < return $number >0; > $result = isPositive(34);

В данном случае функция isPositive должна возвращать значение типа bool , то есть true или false .

Другой пример — возвращение функции:

function select($n): callable< switch($n)< case 1: return function($a, $b) ; case 2: return function($a, $b) ; case 3: return function($a, $b) ; default: return function($a, $b) ; > > $selection = select(2); echo $selection(4,5); // -1

Особо стоит отметить ключевое слово static , добавленное в PHP 8, которое применяется, если надо возвратить из метода класса объект этого же класса:

class Node < function generate() : static< return new Node(); >> $node1 = new Node(); $node2 = $node1->generate();

Типизация свойств

В качестве типа свойств может применяться любой тип кроме callable :

class Person < public $name; public int $age; >$tom = new Person(); $tom->name = "Tom"; $tom->age = 36; // корректное значение echo $tom->age; // 36 $tom->age = "36"; // корректное значение, так как PHP может преобразовать в число echo $tom->age; // 36 $tom->age = "thirty-eight"; // некорректное значение, возникнет ошибка TypeError echo $tom->age;

В данном случае явным образом определено, что свойство $age представляет именно тип int , то есть целое число. Соответственно этому свойству мы сможем присвоить только целое число.

Стоит учитывать, что свойство, для которого не указан тип данных, по умолчанию имеет значение null . Тогда как свойство, для которого указан тип, неинициализировано, то есть не имеет никакого конкретного значения.

Соответственно если нетипизированное свойство мы сможем использовать, то при попытке обратиться к типизированному, но неинициализиованному свойству программа завершит выполнение ошибкой:

$tom = new Person(); echo $tom->name; // норм - null echo $tom->age; // ошибка - свойство неинициализировано

Тип Union

В PHP 8 был добавлен тип union или объединение, который по сути представляет объединение типов, разделенных вертикальной чертой | . Например, мы хотим написать функцию сложения чисел, и чтобы в функцию можно было передавать только числа. Однако числа в PHP предствлены двумя типами — int и float . Чтобы не создавать по функции для каждого типа, применим объединения:

function sum(int|float $n1, int|float $n2,): int|float < return $n1 + $n2; >echo sum(4, 5); // 9 echo "
"; echo sum(2.5, 3.7); // 6.2

В данном случае мы говорим, что параметры $n1 и $n2 могут представлять как тип int , так и тип float . Аналогично возвращаемое значение также может представлять либо int , либо float .

Источник

gettype

Возвращает тип PHP-переменной value . Для проверки типа переменной используйте функции is_* .

Список параметров

Возвращаемые значения

  • «boolean»
  • «integer»
  • «double» (по историческим причинам в случае типа float возвращается «double» , а не просто «float» )
  • «string»
  • «array»
  • «object»
  • «resource»
  • «resource (closed)» с PHP 7.2.0
  • «NULL»
  • «unknown type»

Список изменений

Версия Описание
7.2.0 Для закрытых ресурсов теперь возвращается ‘resource (closed)’ . Ранее для закрытых ресурсов возвращалось ‘unknown type’ .

Примеры

Пример #1 Пример использования gettype()

$data = array( 1 , 1. , NULL , new stdClass , ‘foo’ );

foreach ( $data as $value ) echo gettype ( $value ), «\n» ;
>

Результатом выполнения данного примера будет что-то подобное:

integer double NULL object string

Смотрите также

  • get_debug_type() — Возвращает имя типа переменной в виде, подходящем для отладки
  • settype() — Задаёт тип переменной
  • get_class() — Возвращает имя класса, к которому принадлежит объект
  • is_array() — Определяет, является ли переменная массивом
  • is_bool() — Проверяет, является ли переменная булевой
  • is_callable() — Проверяет, что значение может быть вызвано как функция в текущей области видимости
  • is_float() — Проверяет, является ли переменная числом с плавающей точкой
  • is_int() — Проверяет, является ли переменная целым числом
  • is_null() — Проверяет, является ли значение переменной равным null
  • is_numeric() — Проверяет, является ли переменная числом или строкой, содержащей число
  • is_object() — Проверяет, является ли переменная объектом
  • is_resource() — Проверяет, является ли переменная ресурсом
  • is_scalar() — Проверяет, является ли переменная скалярным значением
  • is_string() — Проверяет, является ли переменная строкой
  • function_exists() — Возвращает true, если указанная функция определена
  • method_exists() — Проверяет, существует ли метод в данном классе

Источник

Оцените статью