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()внутри. Главное — чтобы она выполняла поставленную задачу
Полезное
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()внутри. Главное — чтобы она выполняла поставленную задачу
Полезное
Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\DefineFunctions\NamedArguments;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$this->assertEquals('python', trimAndRepeat('python'));
$this->assertEquals('on', trimAndRepeat('python', offset: 4));
$this->assertEquals('pythonpython', trimAndRepeat('python', repetitions: 2));
$this->assertEquals('onon', trimAndRepeat('python', offset: 4, repetitions: 2));
}
}Решение учителя откроется через:
20:00
