这条线是什么意思?
if ( ${fun("str1")} (fun("str2"), ${fun("str3")}) )
使用 str2 的参数返回值和名称为return_value_for_str3的变量来评估函数return_value_for_str1_of_fun ()_name?
这将测试函数的返回值,该函数的名称是变量 named 中的值fun("str1")
,并给出了参数fun("str2")
和变量 named 的值fun("str3")
。
例子:
如果fun("str1")
equals "x"
、fun("str2")
equals34
和fun("str3")
equals "y"
,则语句如下所示:
if ( $x (34, $y) )
fun("str1")
返回应该是变量名称的字符串,并且该变量的值是匿名函数(可能不是 void 并返回布尔值),它首先获取两个参数是返回值fun("str2")
,第二个是名称与字符串匹配的变量的值由fun("str3")
.返回
一些解决方法:
$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"
哇。那是复杂的代码。让我们一点一点地检查它:
让我们从这个开始:
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
需要填充有效的函数名,以便您的代码行工作。
我们现在已经了解了整行代码,但仍然不清楚它试图实现的目标(除了过于“聪明”和迟钝)。
这是非常非常糟糕的代码。它是故意晦涩难懂的,而且效率低下(即它会运行缓慢)。