奇怪而混乱的PHP语法

Big*_*c66 4 php

我正在接管一个旧网站的维护,并遇到了这种令人困惑的语法,用于处理我以前从未见过的表单,我不确定它的作用:

foreach (array('address','comments','country','email','mail_content','name','title') as $vuln) 
{
    isset($_REQUEST[$vuln]) and $_REQUEST[$vuln] = htmlentities($_REQUEST[$vuln]);
    isset($_GET[$vuln]) and $_GET[$vuln] = htmlentities($_GET[$vuln]);
    isset($_POST[$vuln]) and $_POST[$vuln] = htmlentities($_POST[$vuln]);
    isset($$vuln) and $$vuln = htmlentities($$vuln);
}
Run Code Online (Sandbox Code Playgroud)

它是"和",它让我 - 我把它读作"如果设置变量将其转换为htmlentities,但为什么那里有"和"?

最后,最后一行做了什么?

isset($$vuln) and $$vuln = htmlentities($$vuln);
Run Code Online (Sandbox Code Playgroud)

and*_*wsi 7

它以不寻常的方式使用PHP 的运算符优先级规则.

如果你有一个and语句,如果左边是假的话,PHP将停止处理它 - 没有必要检查右边,因为它不会对最终结果产生影响.(or如果左侧是真的话,对于一个陈述也是如此.)

因此编写此代码的编码器将其用作以下内容的简写:

if (isset($_REQUEST[$vuln])) {
    $_REQUEST[$vuln] = htmlentities($_REQUEST[$vuln]);
}
Run Code Online (Sandbox Code Playgroud)

他们节省了少量的打字,但代价是使代码难以阅读.最好使用它isset来确保在使用它们之前设置数组值,这就是检查的原因.

至于最后一行; 从逻辑上讲,它与上面的相同,但是带有变量变量.第一次通过时,$vuln将设置为数组中的第一项,即address- 最后一行代码检查是否有一个被调用的变量$address,如果是,则将其值设置为htmlentities($address).

这就是代码正在做的事情.为什么它检查REQUEST,GET和POST超出了我的范围.