PHP: Объявления типов
В PHP в функцию можно передать любые значения. Иногда это усложняет понимание кода: не всегда ясно, что именно ожидает функция и что она возвращает. Чтобы сделать код понятнее, в PHP есть объявления типов (их еще называют аннотациями типов или type hints). С их помощью можно явно указать, какие значения принимает функция и какой результат она возвращает. Таким образом мы решаем сразу несколько задач:
- Улучшаем работу редактора кода, получаем подсказки, лучше автодополнение и тому подобное.
- Помогаем ИИ-агентам быстрее видеть структуру и принимать более правильные решения, минимизируя случайные ошибки.
- Появляется возможность проверять корректность программы без ее запуска, за счет статической проверки. Такая проверка не гарантирует, что логика программы написана правильно, но, по крайней мере, в ней не будет ошибок типов.
Как указывать типы параметров
Объявление типов описывает два элемента. Типы параметров указываются прямо в определении функции перед именем каждого параметра. Тип возвращаемого результата указывается после списка параметров через двоеточие.
Разберем на примере функции, которая вычисляет сумму двух переданных значений:
<?php
function add(int $a, int $b): int
{
return $a + $b;
}
print_r(add(2, 3)); // => 5function concat(string $a, string $b): string
│ │ │
│ │ └── тип возвращаемого значения
│ └── тип параметра $b
└── тип параметра $aТеперь редактор кода будет подсказывать, что функция add() принимает два числа и возвращает число. Если попытаться передать неподходящее значение, редактор подсветит это как проблему и предупредит.
Кстати, такие записи вы уже видели. В уроке про необязательные параметры мы разбирали сигнатуру функции round() из документации — round(int|float $num, int $precision = 0): float. Это и есть объявления типов.
Типы проверяются при выполнении
В отличие от многих языков, PHP не только подсказывает типы редактору, но и проверяет их во время работы программы. Если передать значение несовместимого типа, программа завершится с ошибкой TypeError:
<?php
add('abc', 3);
// TypeError: add(): Argument #1 ($a) must be of type int, string givenПри этом PHP остается языком со слабой типизацией, и совместимые значения он приводит автоматически. Строка '2' выглядит как число, поэтому такой вызов сработает:
<?php
add('2', 3); // => 5Это то же самое поведение, которое мы разбирали в уроке про слабую типизацию.
Какие типы используются в объявлениях
На этом этапе достаточно знать объявления для простых, примитивных типов данных:
intдля целых чисел,floatдля чисел с плавающей точкойstringдля строкboolдля логических значений (true или false)
<?php
function describe(string $name, int $age, float $height): string
{
return "{$name}, {$age} лет, рост {$height}";
}
print_r(describe('Anna', 25, 1.70));
// => Anna, 25 лет, рост 1.7Если функция ничего не возвращает, то в качестве возвращаемого типа указывается void. Например, функция может только печатать текст на экран:
<?php
function printGreeting(string $name): void
{
print_r("Hello, {$name}!");
}
printGreeting('Anna');
// => Hello, Anna!Пример с параметрами по умолчанию
Объявления типов работают одинаково как для обязательных параметров, так и для тех, у которых есть значение по умолчанию. Сначала указывается тип, потом имя параметра и через = стандартное значение:
<?php
function greet(string $name, string $greeting = 'Hello'): string
{
return "{$greeting}, {$name}";
}
print_r(greet('Anna')); // => Hello, Anna
print_r(greet('Kirill', 'Hi')); // => Hi, KirillВ этом примере $name является обязательным параметром, а $greeting имеет значение по умолчанию. Объявления показывают типы обоих параметров и возвращаемого результата.
Объявления типов и проверка кода
Кроме проверки во время выполнения, существуют инструменты статической проверки кода, то есть проверки, выполняемой без запуска. «Статическая» значит, что проверка происходит еще до запуска программы. Инструмент читает исходный код и сверяет, соответствуют ли переданные значения указанным типам. Например, если функция принимает строку, а вы передадите число, то при статической проверке это будет показано как ошибка.
Особенно удобно, когда такие ошибки подсвечивает редактор прямо во время написания кода. Это позволяет сразу увидеть проблему и исправить ее, не дожидаясь запуска программы. Благодаря этому многие неожиданные ошибки отлавливаются заранее и в работающем коде их становится меньше.
Объявления типов не являются обязательными. Функции можно писать и без них, PHP все равно будет работать. Но когда объявления есть, код становится понятнее для людей и удобнее для редакторов. Указание типов в своем коде считается хорошей практикой.
Задание
Приложение создает текстовые разделители из повторяющихся символов — например, ------- или =====. Реализуйте функцию wordMultiply(). Она должна принимать два параметра:
- Строку
- Число, которое обозначает, сколько раз нужно повторить строку
И возвращает строку, которая повторяется n-раз. Если передается ноль, то возвращается пустая строка.
<?php
$text = 'php';
print_r(wordMultiply($text, 2)); // => phpphp
print_r(wordMultiply($text, 0)); // =>Укажите объявления типов при определении функции.
Подсказки
- Не забудьте, что тип также нужно указать и у возвращаемого значения
- Повторить строку поможет функция
str_repeat()
Полезное
PHP: Объявления типов
В PHP в функцию можно передать любые значения. Иногда это усложняет понимание кода: не всегда ясно, что именно ожидает функция и что она возвращает. Чтобы сделать код понятнее, в PHP есть объявления типов (их еще называют аннотациями типов или type hints). С их помощью можно явно указать, какие значения принимает функция и какой результат она возвращает. Таким образом мы решаем сразу несколько задач:
- Улучшаем работу редактора кода, получаем подсказки, лучше автодополнение и тому подобное.
- Помогаем ИИ-агентам быстрее видеть структуру и принимать более правильные решения, минимизируя случайные ошибки.
- Появляется возможность проверять корректность программы без ее запуска, за счет статической проверки. Такая проверка не гарантирует, что логика программы написана правильно, но, по крайней мере, в ней не будет ошибок типов.
Как указывать типы параметров
Объявление типов описывает два элемента. Типы параметров указываются прямо в определении функции перед именем каждого параметра. Тип возвращаемого результата указывается после списка параметров через двоеточие.
Разберем на примере функции, которая вычисляет сумму двух переданных значений:
<?php
function add(int $a, int $b): int
{
return $a + $b;
}
print_r(add(2, 3)); // => 5function concat(string $a, string $b): string
│ │ │
│ │ └── тип возвращаемого значения
│ └── тип параметра $b
└── тип параметра $aТеперь редактор кода будет подсказывать, что функция add() принимает два числа и возвращает число. Если попытаться передать неподходящее значение, редактор подсветит это как проблему и предупредит.
Кстати, такие записи вы уже видели. В уроке про необязательные параметры мы разбирали сигнатуру функции round() из документации — round(int|float $num, int $precision = 0): float. Это и есть объявления типов.
Типы проверяются при выполнении
В отличие от многих языков, PHP не только подсказывает типы редактору, но и проверяет их во время работы программы. Если передать значение несовместимого типа, программа завершится с ошибкой TypeError:
<?php
add('abc', 3);
// TypeError: add(): Argument #1 ($a) must be of type int, string givenПри этом PHP остается языком со слабой типизацией, и совместимые значения он приводит автоматически. Строка '2' выглядит как число, поэтому такой вызов сработает:
<?php
add('2', 3); // => 5Это то же самое поведение, которое мы разбирали в уроке про слабую типизацию.
Какие типы используются в объявлениях
На этом этапе достаточно знать объявления для простых, примитивных типов данных:
intдля целых чисел,floatдля чисел с плавающей точкойstringдля строкboolдля логических значений (true или false)
<?php
function describe(string $name, int $age, float $height): string
{
return "{$name}, {$age} лет, рост {$height}";
}
print_r(describe('Anna', 25, 1.70));
// => Anna, 25 лет, рост 1.7Если функция ничего не возвращает, то в качестве возвращаемого типа указывается void. Например, функция может только печатать текст на экран:
<?php
function printGreeting(string $name): void
{
print_r("Hello, {$name}!");
}
printGreeting('Anna');
// => Hello, Anna!Пример с параметрами по умолчанию
Объявления типов работают одинаково как для обязательных параметров, так и для тех, у которых есть значение по умолчанию. Сначала указывается тип, потом имя параметра и через = стандартное значение:
<?php
function greet(string $name, string $greeting = 'Hello'): string
{
return "{$greeting}, {$name}";
}
print_r(greet('Anna')); // => Hello, Anna
print_r(greet('Kirill', 'Hi')); // => Hi, KirillВ этом примере $name является обязательным параметром, а $greeting имеет значение по умолчанию. Объявления показывают типы обоих параметров и возвращаемого результата.
Объявления типов и проверка кода
Кроме проверки во время выполнения, существуют инструменты статической проверки кода, то есть проверки, выполняемой без запуска. «Статическая» значит, что проверка происходит еще до запуска программы. Инструмент читает исходный код и сверяет, соответствуют ли переданные значения указанным типам. Например, если функция принимает строку, а вы передадите число, то при статической проверке это будет показано как ошибка.
Особенно удобно, когда такие ошибки подсвечивает редактор прямо во время написания кода. Это позволяет сразу увидеть проблему и исправить ее, не дожидаясь запуска программы. Благодаря этому многие неожиданные ошибки отлавливаются заранее и в работающем коде их становится меньше.
Объявления типов не являются обязательными. Функции можно писать и без них, PHP все равно будет работать. Но когда объявления есть, код становится понятнее для людей и удобнее для редакторов. Указание типов в своем коде считается хорошей практикой.
Задание
Приложение создает текстовые разделители из повторяющихся символов — например, ------- или =====. Реализуйте функцию wordMultiply(). Она должна принимать два параметра:
- Строку
- Число, которое обозначает, сколько раз нужно повторить строку
И возвращает строку, которая повторяется n-раз. Если передается ноль, то возвращается пустая строка.
<?php
$text = 'php';
print_r(wordMultiply($text, 2)); // => phpphp
print_r(wordMultiply($text, 0)); // =>Укажите объявления типов при определении функции.
Подсказки
- Не забудьте, что тип также нужно указать и у возвращаемого значения
- Повторить строку поможет функция
str_repeat()
Полезное
Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\DefineFunctions\TypeAnnotations;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$reflection = new \ReflectionFunction(__NAMESPACE__ . '\wordMultiply');
$parameterTypes = array_map(
fn ($parameter) => $parameter->getType()?->getName(),
$reflection->getParameters()
);
$this->assertEquals(['string', 'int'], $parameterTypes, 'You should add type declarations for parameters!');
$this->assertEquals('string', $reflection->getReturnType()?->getName(), 'You should add a return type declaration!');
$this->assertEquals('python', wordMultiply('python', 1));
$this->assertEquals('pythonpythonpython', wordMultiply('python', 3));
$this->assertEquals('', wordMultiply('java', 0));
}
}Решение учителя откроется через:
20:00
