2012-10-15 9 views
5

Co oznacza ta linia?Aparaty i podpowiedzi PHP

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

oceny czynności returning_value_for_str1_of_fun() _ nazwa z parametrami powrotu wartość słowo2 i zmiennej z nazwa return_value_for_str3?

+3

Wygląda jak *** dla mnie. Czy to jest kod produkcyjny? – Sherlock

+3

Oznacza to, że ktoś bardzo stara się napisać nieczytelny kod. – Arjan

+0

Tak, to jest zakodowany kod, który muszę zrozumieć. PHP jest dla mnie nowy, próbowałem googlować, ale nie uzyskałem żadnego wyniku. – astrophonic

Odpowiedz

1

Wow. To skomplikowany kod. Przeanalizujmy to po trochu:

Zacznijmy od tego:

fun("str1") 

W rzeczywistości, jest to po prostu wywołanie funkcji do funkcji o nazwie fun(), przekazując wartość ciągu jako parametr.

Ta funkcja jest powtarzana trzy razy w kodzie, z różnymi ciągami jako argumentami. Sama funkcja fun() nie jest dostarczana w twoim przykładowym kodzie, więc nie mogę powiedzieć, co ona robi, ale biorąc pod uwagę kontekst, zakładam, że zwraca ciąg znaków.

Co prowadzi nas do następnego kawałka możemy zbadać:

${fun("str1")} 

Składnia PHP ${...} bierze zawartość szelki i odniesień zmiennej o tej nazwie.

Na przykład ${"myvar"} to to samo, co przy powiedzeniu $myvar. Nazywa się to nazwą zmiennej dynamicznej. Chociaż ma swoje zastosowania, jest to bardzo łatwy sposób napisania złego kodu, który jest trudny do odczytania, zrozumienia lub utrzymania. Twój przykład zdecydowanie należy do tej kategorii.

Jednak teraz, gdy rozumiemy składnię, łatwo zauważyć, że pobiera on ciąg znaków z wywołania funkcji fun() i zamienia je na nazwę zmiennej.

Rozwijając dalej, możemy przepisać kod w następujący sposób, aby uczynić go bardziej zrozumiałym:

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

Tutaj $$var1 jest używana jako nazwa funkcji, zwany z $var2 i $$var3 jako parametry.

Tak więc w $var1 mamy wywołanie funkcji zwracającej ciąg, do którego odwołuje się jako nazwa zmiennej, która jest wywoływana jako funkcja.

Nadal nie wiem, co fun() powraca funkcyjne, czy też nazwy zmiennych, które są generowane przez jego zwrotu są ważne, ale możemy dokonać pewnych założeń, jak i $var2$var1 musiałaby być wypełniona poprawnych nazw funkcji w aby twój wiersz kodu działał w ogóle.

Mamy teraz zrozumienie całej linii kodu, ale nadal nie mamy jasnego obrazu tego, co próbuje osiągnąć (poza nadmiernym "sprytem" i tępością).

Bardzo źle napisany kod bardzo. Jest to celowo niejasne i nieefektywne (tzn. Działa wolno).

3

Testuje wartość zwracaną funkcji, której nazwa jest wartością w zmiennej o nazwie fun("str1"), i podaje argumenty fun("str2") oraz wartość zmiennej o nazwie fun("str3").

Przykład:

Jeśli fun("str1") równa "x", fun("str2") równa 34 i fun("str3") równa "y", to oświadczenie będzie wyglądać następująco:

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

fun("str1") powrotów ciąg, który powinien być nazwa zmiennej i wartości tej zmiennej jest funkcją anonimową (która prawdopodobnie nie jest pusta i zwraca wartość logiczną), która otrzymuje dwa argumenty, pierwsza to wartość zwracana fun("str2"), a druga to wartość zmiennej o nazwie pasującej do ciągu zwracanego przez fun("str3").

1

Niektóre prace wokół:

$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" 
Powiązane problemy