/
Программирование
/
Курс PHP
/

Именованные аргументы

PHP: Именованные аргументы

При вызове функции аргументы можно передавать двумя способами. В позиционном вызове значения идут строго по порядку. Первое попадает в первый параметр, второе во второй. Именованные аргументы появились в PHP 8 и позволяют при вызове явно указать имя параметра. Это удобно, когда у функции много параметров и нужно переопределить лишь некоторые. Остальные остаются со значениями по умолчанию.

<?php

function repeat($text, $times)
{
    return str_repeat($text, $times);
}

repeat('Hi', 3);              // позиционный вызов
repeat(text: 'Hi', times: 3); // именованный вызов

Внутри используется встроенная функция str_repeat() — она повторяет строку указанное количество раз, поэтому repeat('Hi', 3) вернет HiHiHi.

Оба варианта вызова делают одно и то же. Во втором случае мы явно написали, что 'Hi' является значением $text, а 3 является значением $times. Имя параметра указывается без знака $, после имени ставится двоеточие. С точки зрения определения функции ничего не поменялось. Именованные аргументы работают для любой функции, и сама функция об этом ничего не знает. Она получает значения так, как они описаны в определении.

function truncate($text, $length) { ... }

Позиционные:  truncate('hello', 3)
                       └──┬──┘  └┬┘
                       $text   $length

Именованные:  truncate(length: 3, text: 'hello')
                       └───┬───┘  └─────┬─────┘
                       $length        $text

Именованные аргументы можно указывать в любом порядке. Это не меняет результат работы функции, потому что значения связываются именно по имени параметра:

<?php

repeat(times: 3, text: 'Hi'); // => HiHiHi

Именованные аргументы можно комбинировать с позиционными, при этом позиционные идут первыми. Такой вызов позволяет указывать только те параметры, которые нужно переопределить:

<?php

repeat('Hi', times: 3); // позиционные + именованные => HiHiHi

Когда использовать именованные аргументы

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

Вы уже знаете, что у встроенной функции round() второй параметр необязательный. В именованном вызове используются имена параметров из сигнатуры в документации — round(int|float $num, int $precision = 0):

<?php

round(10.252, 1);                 // 10.3
round(num: 10.252, precision: 1); // 10.3 — то же самое, но понятнее

Сила именованных аргументов проявляется, когда необязательных параметров несколько. Посмотрим на встроенную функцию number_format(), которая форматирует число. Ее упрощенная сигнатура выглядит так:

number_format(
    float $num,
    int $decimals = 0,
    string $decimal_separator = '.',
    string $thousands_separator = ','
)

Допустим, мы хотим поменять только разделитель тысяч, а точность и десятичный разделитель оставить по умолчанию:

<?php

// Без именованных аргументов придется явно повторить
// значения всех параметров, которые идут раньше
number_format(1234.567, 0, '.', ' ');              // => 1 235

// С именованными — указываем только нужный
number_format(1234.567, thousands_separator: ' '); // => 1 235

Разделитель указывать стало проще, даже несмотря на то, что перед ним в списке параметров идут еще два. Именованные аргументы делают вызовы понятнее. Читая код, сразу видно, какое значение к какому параметру относится.

Задание

Программа готовит текст уведомлений: убирает ненужные символы с начала и повторяет сообщение нужное количество раз. Допишите функцию trimAndRepeat(), которая принимает три параметра:

  • Строку
  • offset — число символов, на которое нужно обрезать строку слева
  • repetitions — сколько раз нужно повторить строку перед возвратом получившейся строки

Число символов для среза по умолчанию равно 0, а количество повторений по умолчанию равно 1. Сигнатура функции с этими значениями уже задана в шаблоне, вам осталось дописать тело.

Функция должна возвращать полученную строку.

<?php

$text = 'python';

trimAndRepeat($text, offset: 3, repetitions: 2); // honhon
trimAndRepeat($text, repetitions: 3); // pythonpythonpython
trimAndRepeat($text); // python

Подсказки

  • Обрезать строку слева поможет функция substr(), а повторить ее — str_repeat()
  • С точки зрения проверочной системы не имеет значения, каким из способов будет реализована функция trimAndRepeat() внутри. Главное — чтобы она выполняла поставленную задачу

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются