What is the meaning of the '?', '()', and ':' symbols in PHP?

后端 未结 4 1085
一整个雨季
一整个雨季 2021-01-14 02:17

I\'ve finally remembered what to ask. I never really got what : and ? do when a variable is being defined like this:

$ip = ($_SERVER[\'HTTP_X_FORWARDED_FOR\'         


        
相关标签:
4条回答
  • 2021-01-14 03:18

    It's known as a ternary operator and is shorthand for (in your case):

    if($_SERVER['HTTP_X_FORWARD_FOR'])
    {
        $ip = $_SERVER['HTTP_X_FORWARD_FOR'];
    }
    else
    {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    
    0 讨论(0)
  • 2021-01-14 03:18
    "?:" (or ternary) operator
    

    The expression (expr1) ? (expr2) : (expr3) evaluates to expr2 if expr1 evaluates to TRUE, and expr3 if expr1 evaluates to FALSE

    See this example:

    <?php
    // Example usage for: Ternary Operator
    $action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
    
    // The above is identical to this if/else statement
    if (empty($_POST['action'])) {
        $action = 'default';
    } else {
        $action = $_POST['action'];
    }
    
    ?>
    
    0 讨论(0)
  • 2021-01-14 03:19

    The expression looks like this:

    $var = (condition) ? if_true : if_false
    

    ?: is the ternary operator. If condition is true, $var will be assigned the value if_true; otherwise it will be assigned the value if_false.

    In your particular case:

    • This assigns the value of the X-Forwarded-For HTTP header to $ip if it exists; otherwise it uses the remote address itself.

    • This is usually used as a way to get a client's IP address. However, note that in general this is a terrible way to check for client identity. See this StackOverflow question. (Use session cookies or some sort of authentication if you need to make sure users don't clobber each other.)

    • Also, it's HTTP_X_FORWARDED_FOR, not HTTP_X_FORWARD_FOR.

    • Finally, HTTP_X_FORWARDED_FOR can be a comma-delimited list of IP addresses, not just a single one, so this has the potential to be a bug.

    0 讨论(0)
  • 2021-01-14 03:19

    The ternary form is basically a shortcut for if->then->else

    I generally avoid it because it's not all that readable.

    $ip = ($_SERVER['HTTP_X_FORWARD_FOR']) ? $_SERVER['HTTP_X_FORWARD_FOR'] : $_SERVER['REMOTE_ADDR'];
    

    is logically equivalent to:

    if($_SERVER['HTTP_X_FORWARD_FOR']){
       $ip = $_SERVER['HTTP_X_FORWARD_FOR'];
    }else{
       $ip = $_SERVER['REMOTE_ADDR'];
    }
    

    It should be said that this is EXACTLY what this is most commonly used for: variable initialization. Very common with form data.

    0 讨论(0)
提交回复
热议问题