Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对PHP中的一个简单开关感到困惑(5.5.38)_Php_Switch Statement - Fatal编程技术网

对PHP中的一个简单开关感到困惑(5.5.38)

对PHP中的一个简单开关感到困惑(5.5.38),php,switch-statement,Php,Switch Statement,我已经设置了下面的类,它模仿了我目前正在处理并试图修复的类 目标 根据传入的初始值返回费用(值) 问题 我对以下当前代码有两个问题: 当传入的第一个值为0(零)时,返回的12p不正确-应被第一个案例捕获并返回15p 我还没有解决这个问题,但我想退还最后一个满意案例的发行费(如果下一个案例没有定义的话)。例如下面的例子;最后要设置的限制是$lower_3变量-这意味着传入的任何大于31*的值都应返回10p的费用。然而,我看到null被返回,因为检查刚刚通过最后一个案例 代码 第二个目标还没有实现,

我已经设置了下面的类,它模仿了我目前正在处理并试图修复的类

目标 根据传入的初始值返回费用(值)

问题 我对以下当前代码有两个问题:

  • 当传入的第一个值为0(零)时,返回的12p不正确-应被第一个案例捕获并返回15p

  • 我还没有解决这个问题,但我想退还最后一个满意案例的发行费(如果下一个案例没有定义的话)。例如下面的例子;最后要设置的限制是
    $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个案例,然后我将其视为您的解决方案