对PHP中的一个简单开关感到困惑(5.5.38)
我已经设置了下面的类,它模仿了我目前正在处理并试图修复的类 目标 根据传入的初始值返回费用(值) 问题 我对以下当前代码有两个问题:对PHP中的一个简单开关感到困惑(5.5.38),php,switch-statement,Php,Switch Statement,我已经设置了下面的类,它模仿了我目前正在处理并试图修复的类 目标 根据传入的初始值返回费用(值) 问题 我对以下当前代码有两个问题: 当传入的第一个值为0(零)时,返回的12p不正确-应被第一个案例捕获并返回15p 我还没有解决这个问题,但我想退还最后一个满意案例的发行费(如果下一个案例没有定义的话)。例如下面的例子;最后要设置的限制是$lower_3变量-这意味着传入的任何大于31*的值都应返回10p的费用。然而,我看到null被返回,因为检查刚刚通过最后一个案例 代码 第二个目标还没有实现,
$lower_3
变量-这意味着传入的任何大于31*的值都应返回10p的费用。然而,我看到null
被返回,因为检查刚刚通过最后一个案例第二个目标还没有实现,但我想退还最后一笔满意的发行费。在这种情况下,应返回10p,因为传入的值大于31您误解了
switch
语句
switch($var) {
case $val:
//something
意味着
如果$var==$val
则执行//某些操作
因此,在您的代码中:
switch ($volume) {
case ($volume >= $this->lower_1 && $volume <= $this->upper_1):
$issuanceFee = $this->issuanceFee_1;
break;
下面是一个工作示例:
您误解了
开关
语句
switch($var) {
case $val:
//something
意味着
如果$var==$val
则执行//某些操作
因此,在您的代码中:
switch ($volume) {
case ($volume >= $this->lower_1 && $volume <= $this->upper_1):
$issuanceFee = $this->issuanceFee_1;
break;
下面是一个工作示例:
你使用开关箱是错误的。在
case
之后出现的值应与switch()
中出现的值匹配。像$volume>$lower
这样的表达式将被计算为布尔值,该布尔值将与开关($volume)
中的$volume
变量进行比较
我建议只使用带有提前返回的if
语句:
public function calculateIssuanceFee($volume)
{
if ($volume >= $this->lower_1 && $volume <= $this->upper_1) {
return $this->issuanceFee_1;
}
if ($volume >= $this->lower_2 && $volume <= $this->upper_2) {
return $this->issuanceFee_2;
}
if ($volume >= $this->lower_3 && $volume <= $this->upper_3) {
return $this->issuanceFee_3;
}
if ($volume >= $this->lower_4 && $volume <= $this->upper_4) {
return $this->issuanceFee_4;
}
if ($volume >= $this->lower_5) {
return $this->issuanceFee_5;
}
return $this->issuanceFee_1;
}
公共功能计算费用($volume)
{
如果($volume>=$this->lower_1&$volume upper_1){
返回$this->issuanceFee_1;
}
如果($volume>=$this->lower_2&&$volume upper_2){
返回$this->issuanceFee_2;
}
如果($volume>=$this->lower_3&$volume upper_3){
返回$this->issuanceFee_3;
}
如果($volume>=$this->lower_4&&$volume upper_4){
返回$this->issuanceFee_4;
}
如果($volume>=$this->lower_5){
返回$this->issuanceFee_5;
}
返回$this->issuanceFee_1;
}
编辑:再次查看您的代码,您可能真正想要的是定义一个费用列表及其上下限,如果没有匹配项,则返回默认费用。通过如下方式指定代码,您的代码可以更加紧凑:
class IssuanceScheme
{
private $fees = [
['min' => 0, 'max' => 20, 'fee' => '15p'],
['min' => 21, 'max' => 30, 'fee' => '12p'],
];
private $defaultFee = '10p';
public function calculateIssuanceFee($volume)
{
foreach ($this->fees as $fee) {
if ($volume >= $fee['min'] && $volume <= $fee['max']) {
return $fee['fee'];
}
}
return $this->defaultFee;
}
}
类发行方案
{
私人费用$费用=[
['min'=>0,'max'=>20,'fee'=>15p'],
['min'=>21,'max'=>30,'fee'=>12p'],
];
私人$defaultFee='10p';
公共功能计算费用(体积)
{
foreach($this->fees as$fee){
如果($volume>=$fee['min]&&$volume-defaultFee;
}
}
您对开关大小写的使用是错误的。大小写
之后的值应该与开关()中的值匹配。$volume>$lower
之类的表达式将被计算为布尔值,并且该布尔值将与开关中的$volume
变量进行比较($volume)
我建议只使用带有提前返回的if
语句:
public function calculateIssuanceFee($volume)
{
if ($volume >= $this->lower_1 && $volume <= $this->upper_1) {
return $this->issuanceFee_1;
}
if ($volume >= $this->lower_2 && $volume <= $this->upper_2) {
return $this->issuanceFee_2;
}
if ($volume >= $this->lower_3 && $volume <= $this->upper_3) {
return $this->issuanceFee_3;
}
if ($volume >= $this->lower_4 && $volume <= $this->upper_4) {
return $this->issuanceFee_4;
}
if ($volume >= $this->lower_5) {
return $this->issuanceFee_5;
}
return $this->issuanceFee_1;
}
公共功能计算费用($volume)
{
如果($volume>=$this->lower_1&$volume upper_1){
返回$this->issuanceFee_1;
}
如果($volume>=$this->lower_2&&$volume upper_2){
返回$this->issuanceFee_2;
}
如果($volume>=$this->lower_3&$volume upper_3){
返回$this->issuanceFee_3;
}
如果($volume>=$this->lower_4&&$volume upper_4){
返回$this->issuanceFee_4;
}
如果($volume>=$this->lower_5){
返回$this->issuanceFee_5;
}
返回$this->issuanceFee_1;
}
编辑:再次查看您的代码,您可能真正想要的是定义一个带有上下限的费用列表,如果没有匹配项,则返回默认费用。通过如下方式指定,您的代码可以更加紧凑:
class IssuanceScheme
{
private $fees = [
['min' => 0, 'max' => 20, 'fee' => '15p'],
['min' => 21, 'max' => 30, 'fee' => '12p'],
];
private $defaultFee = '10p';
public function calculateIssuanceFee($volume)
{
foreach ($this->fees as $fee) {
if ($volume >= $fee['min'] && $volume <= $fee['max']) {
return $fee['fee'];
}
}
return $this->defaultFee;
}
}
类发行方案
{
私人费用$费用=[
['min'=>0,'max'=>20,'fee'=>15p'],
['min'=>21,'max'=>30,'fee'=>12p'],
];
私人$defaultFee='10p';
公共功能计算费用(体积)
{
foreach($this->fees as$fee){
如果($volume>=$fee['min]&&$volume-defaultFee;
}
}
基于您的两个答案,我已经切换了顺序并删除了上限,因为我认为这更有意义。如果我错了,请纠正我,但它满足我传递的各种值
public function calculateIssuanceFee($volume)
{
if (isset($this->lower_5) && $volume >= $this->lower_5) {
return $this->issuanceFee_5;
}
if (isset($this->lower_4) && $volume >= $this->lower_4) {
return $this->issuanceFee_4;
}
if (isset($this->lower_3) && $volume >= $this->lower_3) {
return $this->issuanceFee_3;
}
if (isset($this->lower_2) && $volume >= $this->lower_2) {
return $this->issuanceFee_2;
}
if (isset($this->lower_1) && $volume >= $this->lower_1) {
return $this->issuanceFee_1;
}
}
基于你的两个答案,我已经改变了顺序并删除了上界,因为我认为这更有意义。如果我错了,请纠正我,但它满足我传递的各种值
public function calculateIssuanceFee($volume)
{
if (isset($this->lower_5) && $volume >= $this->lower_5) {
return $this->issuanceFee_5;
}
if (isset($this->lower_4) && $volume >= $this->lower_4) {
return $this->issuanceFee_4;
}
if (isset($this->lower_3) && $volume >= $this->lower_3) {
return $this->issuanceFee_3;
}
if (isset($this->lower_2) && $volume >= $this->lower_2) {
return $this->issuanceFee_2;
}
if (isset($this->lower_1) && $volume >= $this->lower_1) {
return $this->issuanceFee_1;
}
}
谢谢,这解决了第一个问题。我如何返回最后一个“已定义”的案例?我不考虑你的第4个和第5个案例,然后我认为你的第3个案例没有上限,你将其编码为null。对于你当前的代码,我会说只要删除&&$volume upper\u 3
,你就行了。问题是,$volume谢谢你您的帮助。我将标记Jakub的答案为正确,因为它只涉及稍微更改当前的实现。不过,我肯定会看看查找表方法。谢谢,这解决了第一个问题。我如何返回最后一个“已定义”案例?我将不考虑您的第4个和第5个案例,然后我将其视为您的解决方案