PHP: Создание (определение) функций
До этого момента мы использовали только уже готовые функции: print_r(), strlen(), round() и другие. Но в PHP можно создавать свои собственные функции и пришла пора научиться это делать.
Зачем определять функции
Допустим, у нас есть несколько похожих участков кода:
<?php
print_r("Hello, Hexlet!\n");
print_r("Hello, world!\n");
print_r("Hello, PHP!\n");Чтобы не повторять один и тот же шаблон, мы можем оформить его в виде своей функции, которая принимает на вход один параметр и печатает нужную строчку на экран:
<?php
function sayHello($name)
{
print_r("Hello, {$name}!\n");
}Теперь мы можем вызывать ее с разными аргументами:
<?php
sayHello('Hexlet'); // => Hello, Hexlet!
sayHello('world'); // => Hello, world!
sayHello('PHP'); // => Hello, PHP!Вроде бы количество кода не стало меньше, но появилось кое-что другое. Если эта функция будет использоваться в разных местах, то при необходимости изменить текст, нам будет достаточно поправить только определение функции. И чем сложнее будет задача и чем чаще она будет использоваться в разных местах, тем важнее нужно выделять логику в свои функции.
Определение собственных функций значительно упрощает поддержку программ еще и потому, что позволяет объединять сложные операции в одну. Например, отправка письма на сайте — это достаточно сложный процесс, который включает взаимодействие с внешними системами. Но вся сложность может быть скрыта за одной простой функцией send($email, $title, $body). Один маленький вызов — и много логики внутри.
Синтаксис определения
function имяФункции(параметры)
{
тело
}function greet($name) ← ключевое слово, имя функции и параметр
{
return 'Hello, ' . $name; ← тело функции
}Ключевое слово function начинает определение. В имяФункции допускается любое имя, как у переменной (но без знака $); в скобках указывается список параметров через запятую. Тело функции заключается в фигурные скобки, внутри пишется обычный PHP-код.
В отличие от обычных данных, функции выполняют действия, поэтому их имена практически всегда должны быть глаголами: «построить что-то», «нарисовать что-то», «открыть что-то».
Фигурные скобки показывают, какой код относится к телу функции. Посмотрите на пример:
<?php
function sayHi()
{
print_r('Hi!');
}
print_r('Программа продолжается…');Здесь функция sayHi() определена, но print_r('Программа продолжается…') не относится к функции, так как находится вне фигурных скобок. Он будет выполнен сразу при запуске программы, независимо от вызова sayHi(). Само определение не вызывает и не выполняет функцию — мы лишь говорим, что теперь такая функция существует.
Чтобы sayHi() сработала, ее нужно явно вызвать:
<?php
function sayHi()
{
print_r('Hi!');
}
sayHi(); // => Hi!
print_r('Программа продолжается…');Тело выполняется в тот момент, когда запускается функция. Причем каждый вызов функции запускает тело независимо от других вызовов. Тело может быть даже пустым:
<?php
// Минимальное определение функции, которая ничего не делает
function noop() {}
noop(); // Вызов есть, а смысла нет
// Такая функция тоже бывает полезна,
// но это относится к продвинутым темамПример: функция для печати среднего арифметического
Сейчас мы реализуем простую функцию, которая вычисляет и печатает среднее арифметическое двух чисел. Среднее арифметическое представляет собой сумму чисел, деленную на их количество. Например, среднее от 6 и 4 считается так: (6 + 4) / 2 = 5.
<?php
function printAverage($a, $b)
{
$total = $a + $b;
$average = $total / 2;
print_r($average);
}
printAverage(6, 4); // => 5Здесь $a и $b являются входными параметрами, $total содержит их сумму, $average получается делением суммы на 2, а print_r() выводит результат.
При вызове printAverage(6, 4) на экран выведется 5.
Переиспользование и читаемость
Функции помогают избегать дублирования и делают программы более понятными. Название функции само по себе говорит, что она делает. Это особенно важно в больших проектах, где код читают другие программисты (или вы сами через месяц).
Кстати, создание функции еще называют реализацией, определением и имплементацией. Такие слова часто встречаются на практике.
Задание
Сайт выводит приветствие для каждого посетителя. Реализуйте функцию sayHello(), которая выводит на экран фразу Hello, World!.
<?php
sayHello(); // => Hello, World!В задачах, в которых нужно реализовать функцию, эту функцию вызывать не нужно. Вызывать функцию будут автоматизированные тесты, которые проверяют ее работоспособность. Пример с вызовом выше показан только для того, чтобы вы понимали, как ваша функция будет использоваться.
Полезное
PHP: Создание (определение) функций
До этого момента мы использовали только уже готовые функции: print_r(), strlen(), round() и другие. Но в PHP можно создавать свои собственные функции и пришла пора научиться это делать.
Зачем определять функции
Допустим, у нас есть несколько похожих участков кода:
<?php
print_r("Hello, Hexlet!\n");
print_r("Hello, world!\n");
print_r("Hello, PHP!\n");Чтобы не повторять один и тот же шаблон, мы можем оформить его в виде своей функции, которая принимает на вход один параметр и печатает нужную строчку на экран:
<?php
function sayHello($name)
{
print_r("Hello, {$name}!\n");
}Теперь мы можем вызывать ее с разными аргументами:
<?php
sayHello('Hexlet'); // => Hello, Hexlet!
sayHello('world'); // => Hello, world!
sayHello('PHP'); // => Hello, PHP!Вроде бы количество кода не стало меньше, но появилось кое-что другое. Если эта функция будет использоваться в разных местах, то при необходимости изменить текст, нам будет достаточно поправить только определение функции. И чем сложнее будет задача и чем чаще она будет использоваться в разных местах, тем важнее нужно выделять логику в свои функции.
Определение собственных функций значительно упрощает поддержку программ еще и потому, что позволяет объединять сложные операции в одну. Например, отправка письма на сайте — это достаточно сложный процесс, который включает взаимодействие с внешними системами. Но вся сложность может быть скрыта за одной простой функцией send($email, $title, $body). Один маленький вызов — и много логики внутри.
Синтаксис определения
function имяФункции(параметры)
{
тело
}function greet($name) ← ключевое слово, имя функции и параметр
{
return 'Hello, ' . $name; ← тело функции
}Ключевое слово function начинает определение. В имяФункции допускается любое имя, как у переменной (но без знака $); в скобках указывается список параметров через запятую. Тело функции заключается в фигурные скобки, внутри пишется обычный PHP-код.
В отличие от обычных данных, функции выполняют действия, поэтому их имена практически всегда должны быть глаголами: «построить что-то», «нарисовать что-то», «открыть что-то».
Фигурные скобки показывают, какой код относится к телу функции. Посмотрите на пример:
<?php
function sayHi()
{
print_r('Hi!');
}
print_r('Программа продолжается…');Здесь функция sayHi() определена, но print_r('Программа продолжается…') не относится к функции, так как находится вне фигурных скобок. Он будет выполнен сразу при запуске программы, независимо от вызова sayHi(). Само определение не вызывает и не выполняет функцию — мы лишь говорим, что теперь такая функция существует.
Чтобы sayHi() сработала, ее нужно явно вызвать:
<?php
function sayHi()
{
print_r('Hi!');
}
sayHi(); // => Hi!
print_r('Программа продолжается…');Тело выполняется в тот момент, когда запускается функция. Причем каждый вызов функции запускает тело независимо от других вызовов. Тело может быть даже пустым:
<?php
// Минимальное определение функции, которая ничего не делает
function noop() {}
noop(); // Вызов есть, а смысла нет
// Такая функция тоже бывает полезна,
// но это относится к продвинутым темамПример: функция для печати среднего арифметического
Сейчас мы реализуем простую функцию, которая вычисляет и печатает среднее арифметическое двух чисел. Среднее арифметическое представляет собой сумму чисел, деленную на их количество. Например, среднее от 6 и 4 считается так: (6 + 4) / 2 = 5.
<?php
function printAverage($a, $b)
{
$total = $a + $b;
$average = $total / 2;
print_r($average);
}
printAverage(6, 4); // => 5Здесь $a и $b являются входными параметрами, $total содержит их сумму, $average получается делением суммы на 2, а print_r() выводит результат.
При вызове printAverage(6, 4) на экран выведется 5.
Переиспользование и читаемость
Функции помогают избегать дублирования и делают программы более понятными. Название функции само по себе говорит, что она делает. Это особенно важно в больших проектах, где код читают другие программисты (или вы сами через месяц).
Кстати, создание функции еще называют реализацией, определением и имплементацией. Такие слова часто встречаются на практике.
Задание
Сайт выводит приветствие для каждого посетителя. Реализуйте функцию sayHello(), которая выводит на экран фразу Hello, World!.
<?php
sayHello(); // => Hello, World!В задачах, в которых нужно реализовать функцию, эту функцию вызывать не нужно. Вызывать функцию будут автоматизированные тесты, которые проверяют ее работоспособность. Пример с вызовом выше показан только для того, чтобы вы понимали, как ваша функция будет использоваться.
Полезное
Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\DefineFunctions\DefineFunction;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$expected = 'Hello, World!';
$this->assertOutputOf(fn () => sayHello(), $expected);
}
}Решение учителя откроется через:
20:00
