Type php type show

Описание типов — Основы 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.

Источник

Читайте также:  Collisions in java hashmap
Оцените статью