---

name: Создание (определение) функций
theory: |

  Определение собственных функций значительно упрощает написание и поддержку программ. Функции позволяют объединять сложные (составные) операции в одну. Например, отправка письма на сайте - это достаточно сложный процесс, включающий в себя взаимодействие с внешними системами (интернет). Благодаря возможности определять функции, вся сложность может быть скрыта за одной простой функцией:

  ```php
  <?php

  // Гипотетический пример
  // Место откуда берется функция
  namespace Some\Email\Package\send;

  $email = 'support@hexlet.io';
  $title = 'Помогите';
  $body = 'Я написал историю успеха, как я могу получить скидку?';

  // Один маленький вызов — и много логики внутри
  send($email, $title, $body);
  ```

  Внутри себя подобный вызов выполняет довольно много логики. Соединяется с почтовым сервером, формирует правильный запрос на основе заголовка и тела сообщения, а затем все это отправляет не забыв закрыть соединение.

  Создадим нашу первую функцию. Ее задача - вывести на экран приветствие:

  <pre class='hexlet-basics-output'>Hello, Hexlet!</pre>

  ```php
  <?php

  // Определение функции
  // Определение не вызывает и не выполняет функцию
  // Мы лишь говорим, что теперь такая функция существует
  function showGreeting()
  {
      $text = 'Hello, Hexlet!';
      print_r($text);

  }

  // Вызов функции
  showGreeting(); // => 'Hello, Hexlet!'
  ```

  В отличие от обычных данных, функции выполняют действия, поэтому их имена практически всегда должны быть глаголами: «построить что-то», «нарисовать что-то», «открыть что-то».

  Всё, что описывается ниже имени функции с отступом, называется телом функции. Внутри тела можно описывать любой код. Считайте, что это маленькая самостоятельная программа, набор произвольных инструкций. Тело выполняется ровно в тот момент, когда запускается функция. Причём каждый вызов функции запускает тело независимо от других вызовов.

  Тело функции может быть пустым:

  ```php
  <?php

  // Минимальное определение функции, которая ничего не делает
  function noop() {};

  noop(); // вызов есть, а смысла нет
  // Такая функция тоже бывает полезна,
  // но это относится к продвинутым темам
  ```

  Понятие «создать функцию» имеет много синонимов: «реализовать», «определить» и даже «заимплементить» (от слова implement). Все они встречаются в повседневной практике на работе.

instructions: |

  Реализуйте функцию с именем `printMotto()`, которая выведет на экран фразу *Winter is coming*.

  ```php
  <?php

  printMotto(); // => "Winter is coming"
  ```

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

tips:
  - |
    [Именование в программировании](https://ru.hexlet.io/blog/posts/naming-in-programming)
