Пишем калькулятор на PHP

10.02.2023 в 13:10
56610
+4562
loader

Всем привет! Мы с вами изучили 2 типа запросов: GET и POST. Они позволяют нам отправлять данные на сервер, благодаря чему мы можем с ним «общаться». Мы рассмотрели несколько простейших примеров. В этом уроке для закрепления материала мы с вами напишем свой калькулятор!

Прежде чем приступить к его созданию, давайте обговорим то, что он должен уметь. Пусть наш калькулятор будет принимать на вход 2 числа, и операцию, которую над этими числами нужно совершить (сложение, вычитание, умножение, деление). После этого он будет выводить нам получившееся выражение и его результат.

Итак, вот так будет выглядеть форма для ввода исходных данных:
Форма калькулятора

А вот так будет выглядеть страница с результатом:
Результат вычислений

Давайте теперь спроектируем, где что будет лежать. Я предлагаю сделать такую архитектуру:

  • index.php – здесь будет храниться форма, в которой мы будем заполнять исходные данные
  • result.php – здесь будет храниться шаблон, который будет выводить результат вычислений
  • calc.php – файл, в котором будет храниться непосредственно вся бизнес-логика нашего приложения.

Шаблоны калькулятора

Итак, приступим. Давайте начнём с формы. Она будет содержать в себе:

  • 2 input’а, в которые мы будем записывать аргументы;
  • select, который позволит нам выбрать одну из доступных операций;
  • кнопку, для отправки формы.

Я приведу здесь пример формы, в которой будет только две возможные операции: сложение и вычитание.

<html>
<head>
    <title>Калькулятор</title>
</head>
<body>
<form action="/result.php">
    <input type="text" name="x1">
    <select name="operation">
        <option value="+">+</option>
        <option value="-">-</option>
    </select>
    <input type="text" name="x2">
    <input type="submit" value="Посчитать">
</form>
</body>
</html>

Здесь вам всё должно быть знакомо. Если нет — повторите уроки с формами в курсе HTML.

Мы видим, что данная форма отправляет GET-запрос на адрес /result.php. Как мы уже решили, там будет находиться шаблон для вывода результата вычислений.

Вот пример кода, который получился у меня:

<?php
$result = require __DIR__ . '/calc.php';
?>
<html>
<head>
    <title>Калькулятор</title>
</head>
<body>
    <b>Результат вычислений:</b>
    <br>
    <?= $result ?>
</body>
</html>

Как видим, здесь всё предельно просто — в переменную $result присваивается значение, возвращаемое из файла calc.php. Затем мы просто-напросто выводим результат из этой переменной.

Бизнес-логика калькулятора

Теперь самое интересное — написать бизнес-логику. Создаём файл calc.php и начинаем думать.

Первое, в чём нам стоит убедиться, есть ли вообще какие-либо данные в GET-запросе. Для этого проверяем массив $_GET на пустоту:

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

Сейчас, если перейти по адресу http://myproject.loc/result.php, мы увидим соответствующий результат:
Исходные данные пусты

Далее, нам стоит проверить, что из формы переданы x1, x2 и operation.

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (empty($_GET['x1']) || empty($_GET['x2'])) {
    return 'Не переданы аргументы';
}

Можно теперь вернуться на форму с исходными данными и заполнить её какими-нибудь данными:
Заполняем форму исходными данными

Если теперь нажать на кнопку отправки формы, мы увидим, что никаких ошибок в форме результата теперь не возникло:
Результат без ошибок

Вместо этого мы теперь видим число 1. Это результат того, что в файле calc.php мы ничего не вернули, но при этом попытались это «ничего» с помощью функции require присвоить в переменную $result. Единица вернулась нам, потому что файл был успешно подключен, но ничего не вернул. Это значение по умолчанию.

Попробуем теперь убрать один из аргументов в форме:
Убираем аргумент из исходных данных

Если мы отправим запрос сейчас, то увидим соответствующую ошибку:
Ошибка при пустых аргументах

Ну что, теперь мы знаем, что данные у нас проверяются, можно с ними и поработать.

Давайте для удобства сделаем 2 переменные $x1 и $x2 и положим в них значения из GET-запроса.

//… продолжение файла
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

Давайте теперь составим выражение, которое мы будем вычислять. Его мы просто будем выводить для наглядности.

//… продолжение файла
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
return $expression;

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

Дело осталось за малым — нужно только посчитать результат.

Для того, чтобы определить, какое действие нужно совершить с аргументами, воспользуемся конструкцией switch-case.

В результате получаем такое содержимое calc.php.

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (empty($_GET['x1']) || empty($_GET['x2'])) {
    return 'Не переданы аргументы';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;

Давайте теперь снова отправим форму и посмотрим на результат.
Калькулятор готов

Получили простейший калькулятор, который умеет складывать и вычитать. Разумеется, это лишь простейший прототип. Довести его до ума вы сможете сами, а в домашнем задании вас ждут наводящие вопросы, которые помогут найти ошибки, содержащиеся в приведенном коде.

loader
loader
10.02.2023 в 13:10
56610
+4562
Домашнее задание
  1. Попробуйте в качестве одного из аргументов передать 0. Какой получился результат? Почему так? Дополните код так, чтобы можно было передавать 0.
  2. Усовершенствуйте калькулятор так, чтобы он умножал и делил.
  3. Что произойдёт, если поделить на ноль? Добавьте обработку такой ситуации.
  4. Что произойдёт, если в качестве аргумента передать вместо числа строку? Сделайте так, чтобы в качестве аргументов можно было отправить только числа.
  5. Какие ещё недостатки есть у этого кода? Как можно нарушить его работу? Что можно улучшить?
  6. Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки.

Дополнительно решите вот эту и эту задачи.

Комментарии
Этот урок набрал набрал достаточно большое количество комментариев и дальнейшее его комментирование отключено. Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку, посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали. Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
Логические задачи с собеседований