用 PHP 构建 OOP 计算器

Posted

技术标签:

【中文标题】用 PHP 构建 OOP 计算器【英文标题】:Building an OOP Calculator in PHP 【发布时间】:2013-12-16 14:43:31 【问题描述】:

我正在用 php 构建一个 OOP 计算器,我认为我的起步不错。我有一个 html 文件:

<?php
require_once("includes/initialize.php");
?>
<!DOCTYPE html>
<html>
<head>
    <title>Huiswerk week 2</title>
    <meta charset="utf-8"/>
</head>
<body>
<?php if (isset($error)) : ?>
    <span class="error"><?php print $error; ?></span>
<?php endif; ?>

<?php if (empty($calculation)) : ?>
    <form action="index.php" method="POST">
        <fieldset>
            <legend>Rekenmachine</legend>
            <label for="first-number">Getal 1</label><input type="number" id="first-number" name="first-number "/>
            <label for="second-number">Getal 2</label><input type="number" id="second-number" name="second-number"/>

            <input type="radio" id="countUp" value="countUp" name="option"/><label for="countUp">+</label>
            <input type="radio" id="countDown" value="countDown" name="option"/><label for="countDown">-</label>
            <input type="radio" id="divide" value="divide" name="option"/><label for="divide">/</label>
            <input type="radio" id="multiply" value="multiply" name="option"/><label for="multiply">*</label>
            <input type="submit" id="submit" value="Uitvoeren"/>
        </fieldset>
    </form>
<?php endif; ?>
<?php

if (is_numeric($_POST["first-number"]) && is_numeric($_POST["second-number"])) 
    switch ($_POST["option"]) 
        case "countUp":
            $calc = new Calculator();
            $result = $calc->countUp($_POST["first-number"], $_POST["second-number"]);
            echo $result;
            break;
        case "countDown":
            $calc = new Calculator();
            $result = $calc->countDown($_POST["first-number"], $_POST["second-number"]);
            echo $result;
            break;
        case "divide":
            $calc = new Calculator();
            $result = $calc->divide($_POST["first-number"], $_POST["second-number"]);
            echo $result;
            break;
        case "multiply":
            $calc = new Calculator();
            $result = $calc->divide($_POST["first-number"], $_POST["second-number"]);
            echo $result;
            break;
        default:
            $error = "Something went terribly wrong.";
            echo $error;
            break;
    
 else 
    $error = "One of the given numbers is not numeric.";
    echo $error;

?>
</body>
</html>

index.php 中的包含如下:

<?php
// Require needed files
require_once "settings.php";
require_once "classes/Calculator.php";

try


 catch (Exception $e)
    $error = "Oops, try to fix your error please: " . $e->getMessage() . " on line " . $e->getLine() . " of " . $e->getFile();

并且Calculator类是在这个文件中定义的:

<?php
/**
 * Class Calculator
 */
class Calculator 
    public function __construct()

    

    /**
     * @param $firstNumber
     * @param $secondNumber
     * @return mixed
     */
    public function countUp($firstNumber, $secondNumber)
        $result = $firstNumber + $secondNumber;
        return $result;
    

    /**
     * @param $firstNumber
     * @param $secondNumber
     * @return mixed
     */
    public function countDown($firstNumber, $secondNumber)
        $result = $firstNumber - $secondNumber;
        return $result;
    

    /**
     * @param $firstNumber
     * @param $secondNumber
     * @return float
     */
    public function divide($firstNumber, $secondNumber)
        $result = $firstNumber / $secondNumber;
        return $result;
    

    /**
     * @param $firstNumber
     * @param $secondNumber
     * @return mixed
     */
    public function multiply($firstNumber, $secondNumber)
        $result = $firstNumber * $secondNumber;
        return $result;
    
 

作业是要有一个收集两个值和四个选项(+、-、/、*)的表单。给定的数字将用于选择的计算。计算器必须是面向对象的,并且当发生错误时(例如输入不是数字时),页面将返回到两个输入完整的表单。

我应该如何从这里开始?我曾尝试在 Calculator 类中声明两个变量并使用开关,但它不起作用。

【问题讨论】:

您能否将问题缩小到一段代码,然后将其粘贴到问题中而不是粘贴板链接中?我们一般要求代码在这里内联,这样它就不会依赖脆弱的链接,也为了读者的方便。 另外,如果您可以展示您尝试过的什么,以及“它不起作用”的意思,您的问题会更清楚。 我已将代码嵌入到帖子本身中,感谢您指出这一点。 @halfer:我尝试在 Calculator 类内部和外部定义变量来捕获用户输入的两个值。我还尝试根据开关的结果在类中执行该函数。我无法给出准确的错误或我使用的准确代码,对此我感到抱歉。我面临的问题是,我怎样才能轻松地执行这些功能? 看起来您正在发布到“includes/classes/Calculator.php”,这是您的课程,并且什么也不做。您需要发布到“index.php”,然后使用您的用户输入与$calculator 实例进行交互。 @halfer:所以我想我需要在 index.php 中执行 Calculator::countUp($val1, $val2),例如? 【参考方案1】:

你的表单不会做任何事情。像这样的输入:

<input type="number" id="first-number" />

必须具有name 属性才能返回值。试试这个:

<input type="number" id="first-number" name="first-number" />

id 对于附加每个项目的事件和附加 labels 仍然很有用,所以我会保留它。

其次,即使在正常查看页面时(即在get 操作中),您也正在访问$_POST 超全局。一种解决方案是这样包装您现有的if 语句:

if ($_POST) 
    if (is_numeric($_POST["first-number"]) && is_numeric($_POST["second-number"])) 
        // ...
    

这样,您将仅在用户提交表单时访问post 数据。

【讨论】:

好的,请用您文件的最新状态编辑问题,我再看看。 对,我已经编辑了我的答案。问题的根源在于您正在访问一个不存在的数组索引 - 正常查看页面时,我认为$_POST实际上根本不存在。首先尝试一下,但可以说get 方法在这里更好,因为它更容易使用,并且您不会在表单操作中修改服务器状态。 我已经尝试过条件检查$_POST 是否存在,提交表单后仍然会弹出关于“第一个数字”的相同错误,将表单更改为GET 时会出现相同错误等等$_GET 的条件。 暂时继续发帖。在您的 if ($_POST) 部分,执行 print_r($_POST); exit(); 以查看您拥有哪些索引。这些应该与您表单中的控件相对应。

以上是关于用 PHP 构建 OOP 计算器的主要内容,如果未能解决你的问题,请参考以下文章

php基础知识oop/mvc/orm/aop

面向对象基础

PHP面向对象(OOP)编程入门教程1.什么是面向对象?

php面向对象程序设计

PHP OOP :: 构建 API Wrapper 类

2017.8.04