Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Когда мы пишем на PHP, то не особо задумываемся над типами данных. Мы просто пишем код и ожидаем, что данные будут соответствовать нашим ожиданиям:
<?php
function sayHelloTo($name)
{
print_r("Hello, {$name}");
}
Функция выше, ожидает на вход строку. Это видно по тому, как используется переменная $name
. А что, если мы ошибемся и передадим массив (мы пока не проходили массивы, но без них такую ошибку не получить)? Давайте попробуем.
<?php
// Не обращайте внимание на то, что мы не проходили массивы. Главное здесь то, что в функцию передается не то, что ожидается:
sayHelloTo([]);
// PHP Notice: Array to string conversion
Хотя код отработает, результат не будет соответствовать нашим ожиданиям. В принципе, ничего смертельного в таком поведении нет - это просто цена за использование динамической типизации (о ней будет позже). В тех местах, где входной тип особенно важен, можно добавить соответствующую проверку и генерировать исключение, если переданы неверные данные. По крайней мере так делали раньше, до введения в язык type hinting. Type Hinting - это механизм, который позволяет явно указывать типы параметров. Интерпретатор использует их в своей работе и возбуждает исключение в тех ситуациях, когда тип не соответствует ожидаемому.
По крайней мере, это так работает в большинстве языков, где присутствует данный механизм. В PHP все чуть сложнее и хуже из-за слабой типизации. Несмотря на то, что можно жестко указать тип int
, это не значит, что интерпретатор начнет ругаться на все остальное. Он спокойно проглотит и логический тип и строковый.
Чтобы объявить тип аргумента, необходимо перед его именем добавить имя требуемого типа:
<?php
// int говорит о том, что ожидается число:
function sayHelloTo(int $name)
{
print_r("Hello, {$name}");
}
// всё что может быть приведено к указанному типу будет считаться подходящим
sayHelloTo(false); // Hello, 0
sayHelloTo('1'); // Hello, 1
Попробуем указать тип аргумента - string
(строка).
<?php
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
Теперь ошибка совсем другая - нам явно говорят о том, что типы не сошлись. Увидеть и исправить подобную ошибку уже значительно легче. Рассмотрим еще один пример - с несколькими аргументами:
<?php
function get(string $text, int $index, $default = null)
{
return isset($text[$index]) ? $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, но, если указать значение, по умолчанию равное Null, то указанный тип становится nullable и появится возможность передавать Null снаружи.
Не nullable
<?php
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
nullable
<?php
function printStr(string $value = null)
{
echo $value;
}
printStr(null);
С версии PHP 7.2 появилась возможность указывать тип не только для входящих параметров, но и для возврата функции. Оно записывается через двоеточие после закрывающей скобки:
<?php
function sum(int $a, int $b): int
{
return $a + $b;
}
Если ошибиться в теле функции выше и вернуть строку, то интерпретатор скажет об этом:
TypeError: Return value of sum() must be of the type integer, string returned
В общем и целом, этот механизм никак не влияет на сам процесс программирования и стиль кодирования. Основные его плюсы проявляются в тех местах, где идет работа с классами и интерфейсами, но этот вопрос мы затронем позже, в курсах, посвященных объектно-ориентированному программированию.
Вам ответят команда поддержки Хекслета или другие студенты.
или войти в аккаунт
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт