Что означает символы «?», «()» И «:» в PHP? - PullRequest
4 голосов
/ 23 июня 2010

Я наконец-то вспомнил, что спрашивать. Я никогда не получил то, что: а? делать, когда переменная определяется следующим образом:

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

Как видите, есть? и: и ()

Может ли кто-нибудь дать мне краткую информацию о том, почему и как они используются?

Ответы [ 4 ]

24 голосов
/ 23 июня 2010

Выражение выглядит так:

$var = (condition) ? if_true : if_false

?: - это троичный оператор .Если condition равно true, $var будет присвоено значение if_true;в противном случае ему будет присвоено значение if_false.

В вашем конкретном случае:

  • Это присваивает значение заголовка HTTP X-Forwarded-For $ip, еслиэто существует;в противном случае он использует сам удаленный адрес.

  • Обычно используется для получения IP-адреса клиента.Тем не менее, обратите внимание, что в целом это ужасный способ проверки личности клиента.См. этот вопрос StackOverflow .(Используйте сеансовые куки или какую-то другую аутентификацию, если вам нужно убедиться, что пользователи не сжимают друг друга.)

  • Кроме того, это HTTP_X_FORWARDED_FOR, а не HTTP_X_FORWARD_FOR.

  • Наконец, HTTP_X_FORWARDED_FOR может представлять собой список IP-адресов, разделенных запятыми, а не просто один, так что это может быть ошибкой.

2 голосов
/ 23 июня 2010

Он известен как троичный оператор и является сокращением (в вашем случае):

if($_SERVER['HTTP_X_FORWARD_FOR'])
{
    $ip = $_SERVER['HTTP_X_FORWARD_FOR'];
}
else
{
    $ip = $_SERVER['REMOTE_ADDR'];
}
0 голосов
/ 23 июня 2010

Троичная форма - это, по сути, сокращение для if-> then-> else

Я обычно избегаю этого, потому что он не так уж и удобен для чтения.

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

логически эквивалентно:

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

Следует сказать, что это именно то, для чего это чаще всего используется: инициализация переменной.Очень часто встречается в данных форм.

0 голосов
/ 23 июня 2010
"?:" (or ternary) operator

Выражение (expr1)?(expr2): (expr3) оценивается как expr2, если expr1 оценивается как TRUE, и expr3, если expr1 оценивается как FALSE

См. этот пример:

<?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'];
}

?>
...