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

В программировании большое количество функций и методов имеют параметры, которые редко меняются. В таких случаях этим параметрам задают значения по умолчанию, которые можно поменять по необходимости. В этом уроке мы узнаем, как задавать значения по умолчанию. С помощью этого можно сократить количество одинакового кода:

<?php

// Функция возведения в степень
// Второй параметр имеет значение по умолчанию 2
function myPow($x, $base = 2)
{
    return $x ** $base;
}

// Три во второй степени (двойка задана по умолчанию)
myPow(3); // 3 * 3 = 9
// Три в третьей степени
myPow(3, 3); // 3 * 3 * 3 = 27

Значение по умолчанию выглядит как обычное присваивание в определении. Оно срабатывает только в том случае, если параметр не передан. К этому нужно привыкнуть.

Значение по умолчанию может быть даже в том случае, когда параметр один:

<?php

function myPrint($text = 'nothing')
{
    print_r($text);
}

myPrint(); // => "nothing"
myPrint("Hexlet"); // => "Hexlet"

Параметров со значениями по умолчанию может быть сколько угодно:

<?php

function f($a = 5, $b = 10, $c = 100)
{
  ...
}

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

<?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

// Кредитка передается внутрь как строка
getHiddenCard("1234567812345678", 2); // "**5678"
getHiddenCard("1234567812345678", 3); // "***5678"
getHiddenCard('1234567812345678'); // "****5678"
getHiddenCard('2034399002121100', 1); // "*1100"

Для выполнения задания вам понадобится функция str_repeat(), которая повторяет строку указанное количество раз

<?php

str_repeat('+', 5); // "+++++"
str_repeat('o', 3); // "ooo"
Как с вами связаться? 🙃

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

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "Обсуждение". Как правильно задать вопрос:

В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества

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

Привет! Я Тота и моя задача помочь в обучении. Чтобы активировать меня, нужно зарегистрироваться или залогиниться, если у вас уже есть аккаунт

Loading...

Ваше упражнение проверяется по этим тестам

1<?php
2
3namespace HexletBasics\DefineFunctions\DefaultArguments;
4
5use PHPUnit\Framework\TestCase;
6
7class SolutionTest extends TestCase
8{
9    public function test()
10    {
11        require 'index.php';
12
13        $expected1 = '****1234';
14        $actual1 = getHiddenCard('1234123412341234');
15        $this->assertEquals($expected1, $actual1);
16
17        $expected2 = '**4321';
18        $actual2 = getHiddenCard('1234123412344321', 2);
19        $this->assertEquals($expected2, $actual2);
20    }
21}
22

Решение учителя откроется через:

20:00
waiting_clock