首页 > 解决方案 > 如何将用户输入的百分比转换为小数以及如何输出

问题描述

我对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>

标签: php

解决方案


该函数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_ALLphp.inierror_reporting(E_ALL)代码中使用以启用所有错误的报告。


许多注意事项(如“未定义变量”“未定义数组索引”)不仅仅是一些可以忽略的小事,而是真正的编码错误。PHP 仍然将它们作为次要处理,但从 8.0 版开始,它将更加重视它们并将它们报告为警告。事实上,它们是真正的错误,但将它们报告为错误将破坏自 PHP 发布以来的过去 20 年中积累的大量编写不佳的 PHP 代码。


推荐阅读