Описание типов — Основы PHP
В этом уроке мы поближе познакомимся с типами данных и обсудим нюансы работы с ними.
Когда мы пишем на PHP, то не особо задумываемся над типами данных. Мы просто пишем код и ожидаем, что данные будут соответствовать нашим ожиданиям:
function sayHelloTo($name) print_r("Hello, $name>"); >
Функция выше ожидает на вход строку. Это видно по тому, как используется переменная $name . А что, если мы ошибемся и передадим массив? Давайте попробуем:
// В функцию передается не то, что ожидается: sayHelloTo([]); // PHP Notice: Array to string conversion
Код отработает, но результат не будет соответствовать нашим ожиданиям. Ничего страшного в таком поведении нет — это просто цена за использование динамической типизации.
В тех местах, где входной тип особенно важен, можно добавить соответствующую проверку и генерировать исключение, если переданы неверные данные. По крайней мере так делали раньше, до введения в язык механизма type hinting.
Type Hinting — это механизм, который позволяет явно указывать типы параметров. Интерпретатор использует их и применяет исключение в тех ситуациях, когда тип не соответствует ожидаемому. Так работает в большинстве языков, где присутствует этот механизм.
В PHP используется слабая типизация, поэтому здесь все чуть сложнее. Можно жестко указать тип int , но это не значит, что интерпретатор начнет ругаться на все остальное. Он выполнит автоматическое приведение и спокойно обработает и логический, и строковый тип данных.
Чтобы объявить тип аргумента, необходимо перед его именем добавить имя требуемого типа:
// Тип int говорит, что ожидается число function sayHelloTo(int $name) print_r("Hello, $name>"); > // Все, что может быть приведено к указанному типу, будет считаться подходящим sayHelloTo(false); // Hello, 0 sayHelloTo('1'); // Hello, 1
Попробуем в качестве типа аргумента передать строку string :
function sayHelloTo(string $name) print_r("Hello, $name>"); > sayHelloTo([]); // PHP Fatal error: Uncaught TypeError: Argument 1 passed to sayHelloTo() must be of the type string, array given
Теперь ошибка совсем другая — нам явно говорят, что типы не сошлись. Увидеть и исправить подобную ошибку уже значительно легче. Рассмотрим еще один пример с несколькими параметрами:
function get(string $text, int $index, $default = null) $length = strlen($text); return ($index >= 0) && ($index $length) ? $text[$index] : $default; > get('hi', 3, 8); // 8 get('ho', 'hey'); // PHP Fatal error: Uncaught TypeError: Argument 2 passed to get() must be of the type integer, string given
Обратите внимание на отсутствие типа у $default . Значение по умолчанию может быть абсолютно любым, поэтому тип не указывается.
Null не похож на другие типы данных и ведет себя особым образом. Дело в том, что типы данных в PHP не являются nullable — то есть они не допускают значение Null .
Представим, что мы ждем на вход значение определенного типа — например, строку. В PHP строка не может иметь значение Null . Но это ограничение можно обойти. Можно указать значение, по умолчанию равное Null , и тогда указанный тип становится nullable — появится возможность передавать Null снаружи.
Посмотрим, как это выглядит в коде:
Не nullable:
function printStr(string $value) echo $value; > printStr(null); // PHP Fatal error: Uncaught TypeError: Argument 1 passed to printStr() must be of the type string, null given
function printStr(string $value = null) echo $value; > printStr(null);
Начиная с версии PHP 7.2, в языке появилась возможность указывать тип не только для входящих параметров, но и для возврата функции. Оно записывается через двоеточие после закрывающей скобки:
function sum(int $a, int $b): int return $a + $b; >
Если мы ошибемся в теле функции выше и вернем строку, то интерпретатор скажет об этом:
Еще функция может ничего не возвращать. Например, если она принимает строку, добавляет в конец восклицательный знак и затем печатает результат на экран:
function sayItLoud(string $text): void $loudText = "$text>!"; print_r($loudText); >
Чтобы показать, что функция ничего не возвращает, нужно написать в ее сигнатуре после двоеточия — void .
Строгие типы
В его базовом варианте Type Hinting не очень помогает выявить ошибки типов. Он больше полезен в качестве документации и подсказок в редакторе.
Но в PHP есть специальная директива, включающая режим строгой проверки:
// Включаем режим строгой проверки declare(strict_types = 1); function AddIntAndFloat(int $a, float $b): int return $a + $b; > echo AddIntAndFloat(1.4, '2'); // Fatal error: Uncaught TypeError: Argument 1 passed to AddIntAndFloat() must be of the type int, float given echo AddIntAndFloat(1, '2'); // Fatal error: Uncaught TypeError: Argument 2 passed to AddIntAndFloat() must be of the type float, string given
В таком варианте не происходит автоматического преобразования типов. PHP выполняет точную проверку и выводит ошибку, если типы не совпали.
Типы значений, допускающие значение NULL
Если поставить знак ? перед названием типа данных, то он помечается как обнуляемый — то есть допускающий значение Null .
Это значит, что значение может быть как указанного типа, так и null . Это работает как для входных параметров, так и для возвращаемых функцией значений:
function isPersonMrSmith(?string $person): bool // Тут какая-то логика >
Запись выше означает, что функция isPersonMrSmith() может принять параметр-строку или null .
Стоит сказать, что null должен быть передан явно — isPersonMrSmith(null) . Иначе интерпретатор выдаст ошибку:
isPersonMrSmith(); // Fatal error: Uncaught ArgumentCountError: Too few arguments to function
Посмотрим, как ? работает с типом возвращаемого значения:
public function getName(string $person): ?string // Тут какая-то логика >
Функция getName() принимает переменную $person . Затем функция должна вернуть строку с именем человека. Но иногда строки с именем нет — тогда возвращается null .
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Об обучении на Хекслете
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
gettype
Returns the type of the PHP variable value . For type checking, use is_* functions.
Parameters
The variable being type checked.
Return Values
- «boolean»
- «integer»
- «double» (for historical reasons «double» is returned in case of a float , and not simply «float» )
- «string»
- «array»
- «object»
- «resource»
- «resource (closed)» as of PHP 7.2.0
- «NULL»
- «unknown type»
Changelog
Version | Description |
---|---|
7.2.0 | Closed resources are now reported as ‘resource (closed)’ . Previously the returned value for closed resources were ‘unknown type’ . |
Examples
Example #1 gettype() example
$data = array( 1 , 1. , NULL , new stdClass , ‘foo’ );
foreach ( $data as $value ) echo gettype ( $value ), «\n» ;
>
The above example will output something similar to:
integer double NULL object string
See Also
- get_debug_type() — Gets the type name of a variable in a way that is suitable for debugging
- settype() — Set the type of a variable
- get_class() — Returns the name of the class of an object
- is_array() — Finds whether a variable is an array
- is_bool() — Finds out whether a variable is a boolean
- is_callable() — Verify that a value can be called as a function from the current scope.
- is_float() — Finds whether the type of a variable is float
- is_int() — Find whether the type of a variable is integer
- is_null() — Finds whether a variable is null
- is_numeric() — Finds whether a variable is a number or a numeric string
- is_object() — Finds whether a variable is an object
- is_resource() — Finds whether a variable is a resource
- is_scalar() — Finds whether a variable is a scalar
- is_string() — Find whether the type of a variable is string
- function_exists() — Return true if the given function has been defined
- method_exists() — Checks if the class method exists
User Contributed Notes 2 notes
Be careful comparing ReflectionParameter::getType() and gettype() as they will not return the same results for a given type.
string — string // OK
int — integer // Type mismatch
bool — boolean // Type mismatch
array — array // OK
Same as for «boolean» below, happens with integers. gettype() return «integer» yet proper type hint is «int».
If your project is PHP8+ then you should consider using get_debug_type() instead which seems to return proper types that match used for type hints.