用 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
对于附加每个项目的事件和附加 label
s 仍然很有用,所以我会保留它。
其次,即使在正常查看页面时(即在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 计算器的主要内容,如果未能解决你的问题,请参考以下文章