この行はどういう意味ですか?
if ( ${fun("str1")} (fun("str2"), ${fun("str3")}) )
関数return_value_for_str1_of_fun ()_nameを str2 のパラメーター戻り値とreturn_value_for_str3という名前の変数で評価しますか?
これは、関数の戻り値をテストします。関数の戻り値は、名前が という名前の変数の値でありfun("str1")
、引数fun("str2")
と という名前の変数の値が与えられfun("str3")
ます。
例:
fun("str1")
equals "x"
、fun("str2")
equals 34
、およびfun("str3")
equalsの場合"y"
、ステートメントは次のようになります。
if ( $x (34, $y) )
fun("str1")
変数の名前である必要がある文字列を返し、この変数の値は無名関数 (おそらく void ではなく、ブール値を返します) であり、最初に 2 つの引数を取得し、戻り値を取得fun("str2")
し、2 つ目は文字列に一致する名前の変数の値を取得しますによって返されfun("str3")
ます。
わお。それは複雑なコードです。少しずつ調べてみましょう。
これから始めましょう:
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
これで、コード行全体を理解できましたが、それが何を達成しようとしているのかについてはまだ明確ではありません (過度に「巧妙」で鈍感である以上に)。
これは非常に貧弱に書かれたコードです。これは意図的にわかりにくく、非効率的です (つまり、実行速度が遅くなります)。
いくつかの回避策:
$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"