5

这条线是什么意思?

if ( ${fun("str1")} (fun("str2"), ${fun("str3")}) )

使用 str2 的参数返回值和名称为return_value_for_str3的变量来评估函数return_value_for_str1_of_fun ()_name

4

4 回答 4

3

这将测试函数的返回值,该函数的名称是变量 named 中的值fun("str1"),并给出了参数fun("str2")和变量 named 的值fun("str3")

例子:

如果fun("str1")equals "x"fun("str2")equals34fun("str3")equals "y",则语句如下所示:

if ( $x (34, $y) )
于 2012-10-15T12:10:37.143 回答
2

fun("str1")返回应该是变量名称的字符串,并且该变量的值是匿名函数(可能不是 void 并返回布尔值),它首先获取两个参数是返回值fun("str2"),第二个是名称与字符串匹配的变量的值由fun("str3").返回

于 2012-10-15T12:10:55.850 回答
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"
于 2012-10-15T12:23:19.227 回答
1

哇。那是复杂的代码。让我们一点一点地检查它:

让我们从这个开始:

fun("str1")

实际上,这只是对名为 的函数的函数调用fun(),传入一个字符串值作为参数。

此函数调用在您的代码中重复了 3 次,并使用不同的字符串作为参数。您的示例代码中未提供该函数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需要填充有效的函数名,以便您的代码行工作。

我们现在已经了解了整行代码,但仍然不清楚它试图实现的目标(除了过于“聪明”和迟钝)。

这是非常非常糟糕的代码。它是故意晦涩难懂的,而且效率低下(即它会运行缓慢)。

于 2012-10-15T12:26:14.240 回答