Функции и их вызов

Сложение, конкатенация и остальные рассмотренные операции – всё это довольно базовые возможности языков программирования. Математика не ограничена арифметикой, кроме неё есть и множество других разделов со своими операциями, например, геометрия. То же самое касается и строк: их можно переворачивать, менять регистр букв, удалять лишние символы — и это только самое простое. И, наконец, на более высоком уровне есть прикладная логика конкретного приложения. Программы списывают деньги, считают налоги, формируют отчеты. Количество подобных операций бесконечно и индивидуально для каждой программы. И все они должны быть как-то выражены в коде.

Для выражения любой произвольной операции в программировании существует понятие функция. Функции бывают как встроенные, так и добавленные программистом. С одной встроенной функцией мы уже знакомы, это print_r().

Функции — одна из ключевых конструкций в программировании, без них невозможно сделать практически ничего. Знакомство с ними мы начинаем как можно раньше, так как весь дальнейший материал оперирует функциями по максимуму. Сначала мы научимся пользоваться уже созданными функциями, а уже потом научимся создавать свои собственные.

Начнем с простых функций для работы над строками. Ниже пример вызова функции strrev(), которая переворачивает строку:

<?php

// Вызов функции strrev с аргументом 'Hello!'
$result = strrev('Hello!');
print_r($result); // => '!olleH'

Мы создали переменную $result и указали интерпретатору записать в неё результат, который вернёт вызов функции strrev(). В этом смысле функции идентичны операциям - они всегда возвращают результат своей работы. Запись strrev('Hello!') означает, что вызывается функция с именем strrev, в которую был передан аргумент (или параметр) 'Hello!'. Аргументы нужны функциям для работы так же, как операторам нужны операнды. Функция strrev() переворачивает именно ту строку, которая передаётся ей в аргументах.

Вызов функции всегда обозначается скобками (), идущими сразу за именем функции. В скобках может быть любое количество аргументов, а иногда — вообще ни одного. Количество зависит от используемой функции, например, функция pow() принимает на вход два аргумента и возводит число, переданное первым параметром, в степень, переданную вторым параметром.

<?php

$result = pow(2, 3); // 2 * 2 * 2
print_r($result); // => 8

// В современном PHP появился специальный оператор для возведения в степень:
$result = 2 ** 3; // 8

А вот пример функции, которая не принимает аргументов. Функция rand() генерирует и возвращает случайное число:

<?php

$result = rand();

По большому счёту, операторы и функции — это одно и то же. Ключевая разница только в том, как они записываются. Если представить сложение как функцию, то она будет выглядеть так:

<?php

3 + 5; // 8
sum(3, 5); // 8

// Или даже так
+(3, 5);

// В php такой синтаксис невозможен, но есть языки (например, lisp),
// где оно выглядит очень похоже (посмотрите курс по Racket)

Вопрос на самопроверку. Как узнать, что возвращает вызов print_r()? Проверьте.

Задание

В 7 королевствах жил один человек, который имел доступ к компьютерам и умел программировать — Сэм Тарли. Он занимался картографией, поэтому он написал для себя функцию calculateDistance, высчитывающую расстояние (в лигах) между городами. Функция принимает два строковых параметра — названия двух городов, и возвращает число — расстояние между ними.

Вот пример использования, где на экран выводится расстояние между Lannisport и Bayasabhad:

<?php

use function HexletBasics\Functions\calculateDistance;

$distance = calculateDistance('Lannisport', 'Bayasabhad');
print_r($distance);

Первая строчка — это специальный код, подключающий функцию calculateDistance() в вашу программу. Благодаря ей вы можете запускать функцию, но не видите её содержимое. Это обычное дело в программировании: вы знаете, что делает функция и как ей пользоваться, но не знаете как именно она работает внутри.

Воспользуйтесь функцией calculateDistance() и выведите на экран расстояние между городами Qarth и Vaes Dothrak. Не копируйте пример, а создайте переменную с другим именем и напишите код с нуля самостоятельно.


Определения

  • Функция — операция, способная принимать данные и возвращать результат; функция вызывается так: foo().

  • Аргумент — информация, которую функция получает при вызове. Например, foo(42) — передача аргумента 42 функции foo()


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном cообществе
Упражнение доступно только авторизованным пользователям.

Пожалуйста, авторизуйтесь, это необходимо для отслеживания прогресса выполнения уроков. Если у вас ещё нет учётной записи, то сейчас самое время создать аккаунт.