Каков эффект присвоения переменной себе в PHP? - PullRequest
0 голосов
/ 05 июня 2018

Я изучал фрагмент кода из HTTP-туннельного проекта , с которым я столкнулся при назначении проводной переменной в строке 315 в файле lib.php

if ($publicname) $sysn=$sysn=$_SERVER["SERVER_ADDR"]?$_SERVER["SERVER_ADDR"]:$_SERVER["SERVER_NAME"];

Я не могупонять, почему переменная $ sysn была назначена сама себе?

функция, в которой находится строка кода:

function getmyip ($publicname) {
// try to get the name wih multiple methods in this order:
// $publicname: SERVER_ADDR, SERVER_NAME, php_uname, uname, hostname, own script
// !$publicname: php_uname, uname, hostname, own script, SERVER_ADDR, SERVER_NAME,
$sysn="";
if ($publicname) $sysn=$sysn=$_SERVER["SERVER_ADDR"]?$_SERVER["SERVER_ADDR"]:$_SERVER["SERVER_NAME"];
if (!$sysn || $sysn=="127.0.0.1" || $sysn=="localhost" || preg_match("/\s/",$sysn)) $sysn=php_uname("n");
if (!$sysn || $sysn=="127.0.0.1" || $sysn=="localhost" || preg_match("/\s/",$sysn)) $sysn=`uname -n`;
if (!$sysn || $sysn=="127.0.0.1" || $sysn=="localhost" || preg_match("/\s/",$sysn)) $sysn=`hostname`;
if ($_SERVER["HTTP_HOST"]!="127.0.0.1" && $_SERVER["HTTP_HOST"]!="locahost") {
    $sysurl="http://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]."?a=ip";
    $sysn=file_get_contents($sysurl);
    $sysn=preg_replace("/\\r|\\n/","",$sysn);
}
if (!$sysn || $sysn=="127.0.0.1" || $sysn=="localhost" || preg_match("/\s/",$sysn))
    $sysn=$_SERVER["SERVER_ADDR"]?$_SERVER["SERVER_ADDR"]:$_SERVER["SERVER_NAME"];
if (!$sysn) $sysn=$_SERVER["HTTP_HOST"];
return gethostbyname($sysn);
}

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

В PHP оператор присваивания имеет правильную ассоциативность.Это означает, что переменная, которая назначена другой переменной, которая присваивается чему-либо, просто получит те переменные, которые присвоены крайнему правому значению.Поскольку переменные одинаковы, логика не меняется - одна из $synsn удаляется.

0 голосов
/ 05 июня 2018

Это ужасный код, и вы не должны его использовать, но по сути это плохо написанное NULL-объединение.Значение NULL объединяется в:

if( is_null($bar) ) {
    $foo = 'some default or alternate value';
} else {
    $foo = $bar;
}

Для лучшей читаемости:

$sysn = (
    ($sysn = $_SERVER["SERVER_ADDR"]) ?
         $_SERVER["SERVER_ADDR"] :
         $_SERVER["SERVER_NAME"] 
);

Обратите внимание, что при оценке результата операции присваивания возвращается назначенное значение, а операции присваивания ассоциативно-правый , поэтому они связаны справа налево.

Более краткий пример:

$foo = ( $foo = $bar ) ? $bar : 'bar was unset';
//       ^- NULL, which is false-y
var_dump($foo);

$bar = 'I am bar';
$foo = ( $foo = $bar ) ? $bar : 'bar was unset';
//       ^- string, which is truth-y
var_dump($foo);

Вывод:

Notice: Undefined variable: bar in /in/q2A4n on line 1
string(13) "bar was unset"
string(8) "I am bar"

УведомленияНе следует игнорировать, они указывают, что вы делаете что-то не так.Не достаточно неправильно, чтобы остановить выполнение, но достаточно неправильно, чтобы потенциально вызвать проблемы где-то в будущем.

Если бы это было написано человеком со стандартами и способностью чувствовать стыд, это было бы:

$sysn = (
    ( isset($_SERVER["SERVER_ADDR"]) ) ?
         $_SERVER["SERVER_ADDR"] :
         $_SERVER["SERVER_NAME"] 
);

Или в PHP> = 7 с оператором NULL, объединяющим :

$sysn = $_SERVER["SERVER_ADDR"] ?? $_SERVER["SERVER_NAME"]
0 голосов
/ 05 июня 2018

Это бы ничего не сделало.Это было бы так же, как.

if ($publicname) $sysn=$_SERVER["SERVER_ADDR"]?$_SERVER["SERVER_ADDR"]:$_SERVER["SERVER_NAME"];

может быть опечатка?или что-то?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...