Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите 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

В общем и целом, этот механизм никак не влияет на сам процесс программирования и стиль кодирования. Основные его плюсы проявляются в тех местах, где идет работа с классами и интерфейсами, но этот вопрос мы затронем позже, в курсах, посвященных объектно-ориентированному программированию.


Дополнительные материалы

  1. Официальная документация

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».