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

Необязательные параметры функций

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"

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

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