函数在if语句php中执行顺序

时间:2016-04-02 14:33:21

标签: php if-statement

我想为一个“安全”的php页面创建一个函数来检查令牌(通过post传递的令牌和会话中的那个)。
但是我不想写两个if语句像这样:

function CheckToken(){
    if(isset($_POST['token']) && isset($_SESSION['token']))
        if($_POST['token']==$_SESSION['token']) return true;

    return false;
}

我可以这样做(?):

function CheckToken(){
    if(isset($_POST['token']) && isset($_SESSION['token']) && $_POST['token']==$_SESSION['token']) return true;
    return false;
}

以下是关于执行这些函数的顺序(当使用和运算符时)。所以如果你使用AND操作数,那么如果第一个条件为false则不评估第二个。我记得vb.net有一个解决这个问题的方法(仅评估第一个函数 - 如果它是false则不评估第二个函数)。
因此,将所有内容放在一行上是否安全(如我在第二个例子中做过)?

2 个答案:

答案 0 :(得分:1)

是的,改变这样的顺序确实没有区别。它是完全安全的,因为它所做的只是改变脚本的外观,而执行是完全相同的。

最好选择第二种选择。

答案 1 :(得分:1)

PHP与其他主要语言中通常的if语句评估相同,即从左到右进行检查。

所以,如果你有

if (cond1 && cond2 && cond3)

情景1:
如果cond1为真,则会执行cond2,然后cond3 示例:https://3v4l.org/Ap9SQ

情景2:
如果我们说cond2false,则cond3将被忽略。
示例:https://3v4l.org/u9P4O

同样适用于OR

if (cond1 || cond2 || cond3)

如果cond1为真,则会跳过cond2cond3 示例:https://3v4l.org/ZAZcD

因为您的函数只是返回truefalse,所以您甚至可以将其简化为:

function CheckToken() {
    return isset($_POST['token']) &&
           isset($_SESSION['token']) &&
           $_POST['token'] == $_SESSION['token'];
}

分割线以提高可读性。另外结帐isset手册,因为您可以传入多个变量进行空检查。