PHP: Необязательные параметры функций
Функции могут принимать параметры. Иногда удобно задать значение сразу в определении функции, чтобы не указывать его при каждом вызове. Такое значение называется значением по умолчанию.
Если аргумент не передан, используется это значение. Если аргумент указан, то он заменяет умолчание. С вызовом таких функций мы уже сталкивались, например, у встроенной функции round() второй параметр по умолчанию равен 0. Теперь научимся определять их самостоятельно.
Пример: повторение текста
Сделаем функцию, которая повторяет строку несколько раз. По умолчанию пусть будет один раз, но при желании можно указать другое количество:
<?php
function repeat($text, $times = 1)
{
return str_repeat($text, $times);
}
print_r(repeat('Hi')); // => Hi
print_r(repeat('Hi', 3)); // => HiHiHiВ этом примере используется встроенная функция str_repeat(). Она работает так: берется исходная строка и повторяется указанное количество раз. Например, str_repeat('A', 5) вернет 'AAAAA'. Эта функция часто применяется при генерации шаблонов, разделителей и повторяющихся фрагментов текста.
function repeat($text, $times = 2) ← $times имеет значение по умолчанию
{
...
}
repeat('go') → $times = 2 (по умолчанию)
repeat('go', 5) → $times = 5 (явно указано)Значение по умолчанию выглядит как обычное присваивание в определении. Оно срабатывает только в том случае, если параметр не передан. К этому нужно привыкнуть.
Значение по умолчанию может быть даже в том случае, когда параметр один:
<?php
function myPrint($text = 'nothing')
{
print_r($text);
}
myPrint(); // => "nothing"
myPrint('Hexlet'); // => "Hexlet"Пример: склейка слов с разделителем
По умолчанию слова соединяются пробелом, но можно указать другой символ:
<?php
function joinWords($word1, $word2, $sep = ' ')
{
return $word1 . $sep . $word2;
}
print_r(joinWords('King', 'Road')); // => King Road
print_r(joinWords('Dragon', 'stone', '-')); // => Dragon-stoneПример: несколько параметров по умолчанию
Функция может содержать более одного параметра со значениями по умолчанию. Например, сделаем функцию, которая строит строку-разделитель. По умолчанию символом является дефис, а длина равна 10:
<?php
function makeLine($symbol = '-', $length = 10)
{
return str_repeat($symbol, $length);
}
print_r(makeLine()); // => ----------
print_r(makeLine('*')); // => **********
print_r(makeLine('*', 5)); // => *****
print_r(makeLine('#', 3)); // => ###Ограничение на порядок параметров
Необязательные параметры всегда указываются в конце списка параметров. С точки зрения синтаксиса невозможно создать функцию, у которой после необязательного параметра идет обязательный:
<?php
// Такой код завершится с ошибкой
function f($a = 5, $b = 10, $c = 100, $x)
{
...
}
// И такой
function f($a = 5, $b = 10, $x, $c = 100)
{
...
}
// А вот такой сработает
function f($x, $a = 5, $b = 10, $c = 100)
{
...
}
// И такой
function f($x, $y, $a = 5, $b = 10, $c = 100)
{
...
}Задание
Реализуйте функцию getHiddenCard(), которая принимает на вход номер кредитки (состоящий из 16 цифр) в виде строки и возвращает его скрытую версию, которая может использоваться на сайте для отображения. Если исходная карта имела номер 2034399002125581, то скрытая версия выглядит так ****5581. Другими словами, функция заменяет первые 12 символов, на звездочки. Количество звездочек регулируется вторым, необязательным, параметром. Значение по умолчанию — 4.
<?php
// Кредитка передается внутрь как строка
// Второй параметр не передается, значит звездочек будет 4
getHiddenCard('1234567812345678'); // "****5678"
getHiddenCard('1234567812345678', 2); // "**5678"
getHiddenCard('1234567812345678', 3); // "***5678"
// Или используя переменные
$cardNumber = '2034399002121100';
getHiddenCard($cardNumber); // "****1100"
getHiddenCard($cardNumber, 1); // "*1100"Для выполнения задания вам понадобится функция str_repeat(), которая повторяет строку указанное количество раз:
<?php
str_repeat('+', 5); // "+++++"
str_repeat('o', 3); // "ooo"PHP: Необязательные параметры функций
Функции могут принимать параметры. Иногда удобно задать значение сразу в определении функции, чтобы не указывать его при каждом вызове. Такое значение называется значением по умолчанию.
Если аргумент не передан, используется это значение. Если аргумент указан, то он заменяет умолчание. С вызовом таких функций мы уже сталкивались, например, у встроенной функции round() второй параметр по умолчанию равен 0. Теперь научимся определять их самостоятельно.
Пример: повторение текста
Сделаем функцию, которая повторяет строку несколько раз. По умолчанию пусть будет один раз, но при желании можно указать другое количество:
<?php
function repeat($text, $times = 1)
{
return str_repeat($text, $times);
}
print_r(repeat('Hi')); // => Hi
print_r(repeat('Hi', 3)); // => HiHiHiВ этом примере используется встроенная функция str_repeat(). Она работает так: берется исходная строка и повторяется указанное количество раз. Например, str_repeat('A', 5) вернет 'AAAAA'. Эта функция часто применяется при генерации шаблонов, разделителей и повторяющихся фрагментов текста.
function repeat($text, $times = 2) ← $times имеет значение по умолчанию
{
...
}
repeat('go') → $times = 2 (по умолчанию)
repeat('go', 5) → $times = 5 (явно указано)Значение по умолчанию выглядит как обычное присваивание в определении. Оно срабатывает только в том случае, если параметр не передан. К этому нужно привыкнуть.
Значение по умолчанию может быть даже в том случае, когда параметр один:
<?php
function myPrint($text = 'nothing')
{
print_r($text);
}
myPrint(); // => "nothing"
myPrint('Hexlet'); // => "Hexlet"Пример: склейка слов с разделителем
По умолчанию слова соединяются пробелом, но можно указать другой символ:
<?php
function joinWords($word1, $word2, $sep = ' ')
{
return $word1 . $sep . $word2;
}
print_r(joinWords('King', 'Road')); // => King Road
print_r(joinWords('Dragon', 'stone', '-')); // => Dragon-stoneПример: несколько параметров по умолчанию
Функция может содержать более одного параметра со значениями по умолчанию. Например, сделаем функцию, которая строит строку-разделитель. По умолчанию символом является дефис, а длина равна 10:
<?php
function makeLine($symbol = '-', $length = 10)
{
return str_repeat($symbol, $length);
}
print_r(makeLine()); // => ----------
print_r(makeLine('*')); // => **********
print_r(makeLine('*', 5)); // => *****
print_r(makeLine('#', 3)); // => ###Ограничение на порядок параметров
Необязательные параметры всегда указываются в конце списка параметров. С точки зрения синтаксиса невозможно создать функцию, у которой после необязательного параметра идет обязательный:
<?php
// Такой код завершится с ошибкой
function f($a = 5, $b = 10, $c = 100, $x)
{
...
}
// И такой
function f($a = 5, $b = 10, $x, $c = 100)
{
...
}
// А вот такой сработает
function f($x, $a = 5, $b = 10, $c = 100)
{
...
}
// И такой
function f($x, $y, $a = 5, $b = 10, $c = 100)
{
...
}Задание
Реализуйте функцию getHiddenCard(), которая принимает на вход номер кредитки (состоящий из 16 цифр) в виде строки и возвращает его скрытую версию, которая может использоваться на сайте для отображения. Если исходная карта имела номер 2034399002125581, то скрытая версия выглядит так ****5581. Другими словами, функция заменяет первые 12 символов, на звездочки. Количество звездочек регулируется вторым, необязательным, параметром. Значение по умолчанию — 4.
<?php
// Кредитка передается внутрь как строка
// Второй параметр не передается, значит звездочек будет 4
getHiddenCard('1234567812345678'); // "****5678"
getHiddenCard('1234567812345678', 2); // "**5678"
getHiddenCard('1234567812345678', 3); // "***5678"
// Или используя переменные
$cardNumber = '2034399002121100';
getHiddenCard($cardNumber); // "****1100"
getHiddenCard($cardNumber, 1); // "*1100"Для выполнения задания вам понадобится функция str_repeat(), которая повторяет строку указанное количество раз:
<?php
str_repeat('+', 5); // "+++++"
str_repeat('o', 3); // "ooo"Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\DefineFunctions\DefaultParameters;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$this->assertEquals('****1234', getHiddenCard('1234123412341234'));
$this->assertEquals('****4321', getHiddenCard('1234123412344321'));
$this->assertEquals('***4321', getHiddenCard('1234123412344321', 3));
}
}Решение учителя откроется через:
20:00
