if ( ${fun("str1")} (fun("str2"), ${fun("str3")}) )
评估使用参数 str2 的返回值以及名称为 str3 返回值的变量的函数 returning_value_for_str1_of_fun() 的返回值?
该测试返回名称为变量fun("str1")
的函数返回值,并给出参数fun("str2")
和变量fun("str3")
的值。请参考以下示例:
例如:
如果fun("str1")
等于"x"
,fun("str2")
等于34
,fun("str3")
等于"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()
的函数进行函数调用,并将字符串值作为参数传递。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
需要填充有效的函数名才能使您的代码行正常工作。
现在我们已经理解了整个代码行,但仍然没有清晰地了解它试图实现什么(除了过度“聪明”和晦涩难懂)。
这是非常非常糟糕的编码。它故意模糊不清,而且效率低下(即它将运行缓慢)。