PHP大括号和条件语句

5
这行代码是什么意思?
if ( ${fun("str1")} (fun("str2"), ${fun("str3")}) )

评估使用参数 str2 的返回值以及名称为 str3 返回值的变量的函数 returning_value_for_str1_of_fun() 的返回值?

3
这对我来说看起来像是***。这是生产代码吗? - Sherlock
3
意思是有人非常努力地写难以阅读的代码。 - Arjan
是的,这是我需要理解的混淆代码。PHP 对我来说很新,我尝试过谷歌搜索,但没有得到任何结果。 - astrophonic
4个回答

3

该测试返回名称为变量fun("str1")的函数返回值,并给出参数fun("str2")和变量fun("str3")的值。请参考以下示例:

例如:

如果fun("str1")等于"x"fun("str2")等于34fun("str3")等于"y",则语句如下所示:

if ( $x (34, $y) )

2

fun("str1") 返回一个字符串,应该是变量的名称,而此变量的值是一个匿名函数(可能不是 void 类型且返回布尔类型),该函数接受两个参数:第一个参数是 fun("str2") 的返回值,第二个参数是与 fun("str3") 返回的字符串匹配的变量的值。


1

一些解决方法:

$func = 'fun';
$str3 = 'str3';

echo ${fun("str1")} (fun("str2"), ${fun("str3")}); // will output 'str2'

function fun($param1, $param2 = ''){

    if($param1 == 'str2' || $param1 == 'str3')
        return $param1;
    elseif($param1 == 'str1')
        return 'func';
    else
        echo ' you are done';


}

Evaluates as follows:
    fun("str1") -> 'func'
    ${fun("str1")} -> $func -> fun
    fun("str2") -> 'str2'
    fun("str3") -> 'str3'
    ${fun("str3")} -> $str3

    ${fun("str1")} (fun("str2"), ${fun("str3")})
    => $func ("str2", $str3)
    => fun("str2", "str3")
    => "str2"

1

哇,这是一段复杂的代码。让我们逐个部分来看:

我们从这里开始:

fun("str1")

实际上,这只是对名为fun()的函数进行函数调用,并将字符串值作为参数传递。
在您的代码中,此函数调用重复三次,参数为不同的字符串。函数fun()本身未在示例代码中提供,因此我无法确定它的功能,但考虑到上下文,我假设它返回一个字符串。
这将引导我们进入下一个可以检查的部分:
${fun("str1")}

在 PHP 中,${...} 语法会获取大括号中的内容并引用该名称的变量。

例如,${"myvar"} 等同于 $myvar。这被称为动态变量名。虽然它确实有其用途,但它是编写糟糕代码的一种非常简单的方式,难以阅读、理解或维护。您的示例明显属于此类别。

然而,现在我们了解了语法,很容易看出它正在获取 fun() 函数调用的字符串输出,并将其转换为变量名。

进一步扩展,我们可以重写代码如下以使其更清晰:

$var1 = fun("str1");
$var2 = fun("str2");
$var3 = fun("str3");
if ( $$var1 ($var2, $$var3) )

在这里,$$var1被用作函数名,使用$var2$$var3作为参数进行调用。

因此,在$var1中,我们有一个函数调用返回一个字符串,该字符串被引用为变量名,并被调用为函数。

我们仍然不知道fun()函数返回什么,或者其返回的变量名是否有效,但我们可以做出一些假设,因为$var1$var2需要填充有效的函数名才能使您的代码行正常工作。

现在我们已经理解了整个代码行,但仍然没有清晰地了解它试图实现什么(除了过度“聪明”和晦涩难懂)。

这是非常非常糟糕的编码。它故意模糊不清,而且效率低下(即它将运行缓慢)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接