2012-10-15 7 views
5

この行は何を意味しますか?パラメータを持つPHPの中かっこと条件付き

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

(機能returning_value_for_str1_of_funを評価)_名は名前return_value_for_str3でSTR2、変数の値を返しますか?

+3

***に私のように見えます。この生産コードですか? – Sherlock

+3

誰かが読めないコードを書くのを非常に難しくしているということです。 – Arjan

+0

ええ、それは私が理解する必要がある難読化されたコードです。 PHPは私には新しく、私はこれをグーグルで試しましたが、何の結果も得られませんでした。 – astrophonic

答えて

1

うわー。それは複雑なコードです。さんはそれを少しずつ見てみましょう:

はこれで始めるのをしてみましょう:実際には

fun("str1") 

、これは、パラメータとして文字列値を渡し、単にfun()という名前の関数への関数呼び出しです。

この関数呼び出しは、引数として異なる文字列を使用してコード内で3回繰り返されます。関数fun()自体はあなたのサンプルコードでは提供されていないので、私はそれが何であるかを知ることはできませんが、コンテキストを仮定すると、文字列を返すと仮定します。私たちが調べることができ、次のビットに私たちをリード

:PHPで

${fun("str1")} 

${...}構文は、中括弧の内容を取得し、その名前の変数を参照します。

したがって、${"myvar"}は、$myvarと同じです。これは動的変数名と呼ばれます。それはその用途を持っていますが、読んだり理解したり維持したりするのが難しい、悪いコードを書くのはとても簡単な方法です。あなたの例は間違いなくこのカテゴリに該当します。

ただし、構文を理解したので、fun()関数の文字列出力を変数名に変換することは容易にわかります。ここで

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

$$var1は、関数名として使用されるパラメータとして$var2$$var3と呼ばれている:それをより明確にするために、次のようにさらに拡大

は、我々はコードを書き換えることができます。

したがって、$var1には、関数として呼び出される変数名として参照されている文字列を返す関数呼び出しがあります。

我々はまだ$var1$var2は、有効な関数名が移入される必要があるであろうと、fun()関数が戻る、またはその戻り値によって生成された変数名かどうかが有効であるが、我々はいくつかの仮定を作ることができるかわかりませんあなたのコード行がまったく動作するようにしてください。

私たちはコード全体を理解していますが、それが達成しようとしていること(過度に巧みで鈍い)をはっきりとは理解できません。

これは非常に非常にで書かれたコードです。それは意図的にあいまいであり、非効率的です(ゆっくりと実行されます)。

3

これは、名前が変数fun("str1")の値であり、引数がfun("str2")で、変数がfun("str3")である関数の戻り値をテストします。

例:

fun("str1")"x"に等しい場合は、fun("str2")34に等しく、fun("str3")"y"に等しく、その文は次のようになります。変数の名前と値でなければなりません

if ($x (34, $y)) 
2

fun("str1")返す文字列この変数の最初の2つの引数は戻り値fun("str2")であり、2番目の値は値(つまり、 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"