php - 如何将用户输入的百分比转换为小数以及如何输出
问题描述
我对php相当陌生,所以如果你对我的问题没有耐心,我明白没有必要粗鲁,请忽略我的帖子,谢谢!
我正在尝试制作一个表单,用户输入价格和折扣百分比以查看销售价格,这就是我目前所拥有的:
<?php
$ogprice= $_POST['price'];
$discountper= $_POST['discount'];
function discountCalculations () {
$saleprice = $ogprice - ($ogprice * ($discountper / 100));
return $saleprice;
}
?>
<html>
<title>Discount Calculator </title>
<body>
<h1>Discount Calculator</h1>
<form name="discountCalculator" action="functions.php" method="post">
<input type="text" name="price" placeholder="Original Price" ><br>
<input type="text" name="discount" placeholder="Discount" ><br>
<input type="submit" value="Calculate values"/>
</form>
<?php
echo discountCalculations ();
?>
</body>
</html>
解决方案
该函数discountCalculations()
返回0
所有输入,因为变量$ogprice
和$discountper
未初始化(它们在使用时实际上不存在)。
PHP 实际上是通过通知告诉您这一点:
PHP 注意:未定义变量:discountper
但是,最有可能的是,您的 PHP 解释器被配置为(默认情况下)忽略这些通知。
(这是错误的,但这是一个不同的主题。)
在 PHP 中有两个变量作用域:一个局部作用域(属于每个函数,只有该函数的代码可以访问它)和全局作用域。
与其他可以从任何地方访问全局范围的语言不同,在 PHP 中,默认情况下只能从全局代码访问全局范围。这是任何函数或类方法之外的代码。
这些行:
$ogprice = $_POST['price'];
$discountper = $_POST['discount'];
创建变量$ogprice
并$discountper
在全局范围内(因为它们在任何函数之外。)
默认情况下,函数代码discountCalculations()
看不到全局变量$ogprice
和$discountper
. 当它到达这条线时:
$saleprice = $ogprice - ($ogprice * ($discountper / 100));
变量$ogprice
并且$discountper
不存在于函数的局部范围内。PHP 显示三个关于它们的通知(一个用于未定义变量的每次使用)并NULL
改为使用。在数字上下文中使用时,NULL
将转换为数字0
并且计算等效于:
$saleprice = 0 - (0 * (0 / 100));
显然结果总是0
。
一个函数可以访问全局范围,但我不会告诉你怎么做。在任何语言中使用全局变量都是不好的做法。
相反,我建议您让函数接受要使用的值作为参数:
function discountCalculations ($price, $discount) {
$saleprice = $price - ($price * ($discount / 100));
return $saleprice;
}
现在,$price
和$discount
是函数的参数。函数参数属于函数的本地范围,但它们使用用于调用函数的值进行初始化:
$ogprice = $_POST['price'];
$discountper = $_POST['discount'];
echo discountCalculations($ogprice, $discountper);
这样,您可以重用具有不同值的函数,并且它没有隐藏的依赖关系。任何阅读代码的人都清楚该函数需要两个值来完成其工作。
在 PHP 文档中阅读有关变量范围的更多信息。
(然后忘记您在该页面中阅读的有关global
关键字的任何内容,因为它对您的代码和您的编码风格弊大于利:-))
另请阅读 PHP 中的各种错误级别,并在代码error_reporting=E_ALL
中php.ini
或error_reporting(E_ALL)
代码中使用以启用所有错误的报告。
许多注意事项(如“未定义变量”或“未定义数组索引”)不仅仅是一些可以忽略的小事,而是真正的编码错误。PHP 仍然将它们作为次要处理,但从 8.0 版开始,它将更加重视它们并将它们报告为警告。事实上,它们是真正的错误,但将它们报告为错误将破坏自 PHP 发布以来的过去 20 年中积累的大量编写不佳的 PHP 代码。
推荐阅读
- c++ - gdb - 查找 strncmp() 函数的值
- node.js - RESTful API, http get from couple of keys
- c# - 403 消息:旧版 People API 尚未在项目中使用
- javascript - 使用 moment.js 将这些 GMT 时间/日期字符串转换为 UTC 时间/日期
- android - 2019 年 8 月 1 日更新补丁后,Android 9 WiFi 设置的左上箭头(返回按钮)无法正常工作
- java - 如何在 java 中创建用户定义的 SettableFuture
- bash - Dockerfile throws an error while running bash script from it
- .net - UdpClient BeginReceive 中的 SocketException 即使使用 try/catch 也会导致整个过程崩溃
- reactjs - 用 Y 参数告诉 apollo-client 从 X 查询返回什么?
- html - How can i change the style of the drop down panel of a select box to have round corners for chrome browser