比多个如果更好的方法?

时间:2019-05-07 09:55:58

标签: php if-statement conditional-statements

比php中的if条件更好的方法?如果条件太多,那么我需要更简单有效的方法...并且您可以向我展示示例?!

if($_GET['id']=="4") { 
     try {
     $ids = '4,246,226';
     $notin = '1';
     $parent_forum = 'php_forums.parent_id';
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
                         }
}
if($_GET['id']=="246") { 
     try {
     $ids = '246';
     $notin = '1';
     $parent_forum = 'php_forums.parent_id';
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
                         }
}
if($_GET['id']=="226") { 
     try {
     $ids = '226';
     $notin = '1';
     $parent_forum = 'php_forums.parent_id';
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
                         }
}

1 个答案:

答案 0 :(得分:1)

关于代码的事情是,您可以通过许多不同的方式解决一个问题。根据环境以及您要如何组织问题和项目的规模,这都是合理的。

因此,例如,如评论中所述,if conditions的很好替代是switch cases

切换案例示例

我不清楚您问题背后的整个结构,但是我将提供解决方案。

/**
 * @throws Exception
 */
public function doSomethingWithGET()
{
    $notin          = 1;
    $parent_forum   = 'php_forums.parent_id';

    switch ($_GET['id']) {
        case '4':
        case '246':
        case '226':
            $ids = $_GET['id'];
            break;
        default:
            throw new Exception('Specify your error message here');

    }
}

我将切换用例归为一组的唯一原因是,您的代码中似乎没有什么变化可以证明明确的分离,但是请注意,您可以根据您的ID来区分两种情况,或者将某些IDS分组如果只有少数几个具有相同的性能,则可以将特定的IDS分离为非常特定的行为。

方法调用

这种情况只是解决同一问题的另一种方式。只是因为它的傻笑和玩味:)我敢肯定它有自己的游戏案例,就像get_class可以避免我们为工厂类不断创建switch case一样,但是正如前面提到的,这一切都取决于关于你的想法:)

class Test
{
   /**
    * @var array $idsAndActions
    **/
    protect $idsAndActions;

    public function __construct ()
    {
        $this->idsAndActions = [
            '4'   => 'doSomethingWithGET',
            '246' => 'doSomethingWithGET',
            '226' => 'somethingDifferent',
        ];
    }


    public function parseGet ()
    {
        if (array_key_exists($_GET['id'], $this->idsAndActions)) {
            $methodCall = $this->idsAndActions[$_GET['id']];
            if (method_exists($this, $methodCall)) {
                $this->$methodCall();
                //add here more code for success events
            }
        }

        echo '[Error] Your message';
        //You can also throw an exception, which I would advice depending on who calls this :)
    }

    public function doSomethingWithGET ()
    {
        $this->notin = 1;
        $this->parent_forum = 'php_forums.parent_id';
        $this->ids = $_GET['id'];

    }

    public function somethingDifferent ()
    {
        $this->notin = 20;
        $this->parent_forum = 'another_thing_here';
        $this->ids = $_GET['id'];
    }

}

希望它可以帮助您提出一些想法,以解决该问题或找到最适合您的解决方案! :)

注意:我知道没有提到它,但是,如果您使用的是$_GET['id'],则可以对DBs进行某种访问或执行system commands不要忘记system breachsql injection的可能性。永远不要信任系统外部的变量