2012-10-15 5 views
5

Cosa significa questa riga?parentesi PHP e condizionale

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

valutare la funzione returning_value_for_str1_of_fun() _ nome con i parametri di ritorno rapporto qualità-str2 e variabili con il nome return_value_for_str3?

+3

Sembra per me un ***. Questo codice di produzione? – Sherlock

+3

Significa che qualcuno sta provando a scrivere codice illeggibile. – Arjan

+0

Sì, è un codice offuscato che devo capire. PHP è nuovo per me, ho provato a cercarlo su google, ma non ho ottenuto alcun risultato. – astrophonic

risposta

1

Wow. È un codice contorto. Esaminiamo a poco a poco:

Partiamo da questo:

fun("str1") 

In realtà, questa è semplicemente una chiamata di funzione per una funzione denominata fun(), passando un valore stringa come parametro.

Questa chiamata di funzione viene ripetuta tre volte nel codice, con stringhe diverse come argomenti. La funzione fun() non è fornita nel codice di esempio, quindi non posso dire cosa fa, ma dato il contesto presumo che restituisca una stringa.

Il che ci porta al prossimo po 'possiamo esaminare:

${fun("str1")} 

Il ${...} sintassi PHP prende il contenuto delle parentesi graffe e riferimenti una variabile di quel nome.

Quindi, ad esempio, ${"myvar"} equivale a dire $myvar. Questo è chiamato un nome di variabile dinamico. Mentre ha i suoi usi, è un modo molto semplice per scrivere codice cattivo, che è difficile da leggere, capire o mantenere. Il tuo esempio rientra sicuramente in questa categoria.

Tuttavia, ora che capiamo la sintassi, è facile vedere che sta prendendo l'output di stringa della chiamata di funzione fun() e trasformandolo in un nome di variabile.

espandendo ulteriormente, possiamo riscrivere il codice come segue per renderlo più chiaro:

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

Qui, $$var1 viene utilizzato come nome funzione, chiamata con $var2 e $$var3 come parametri.

Quindi in $var1, abbiamo una chiamata di funzione che restituisce una stringa a cui viene fatto riferimento come nome di variabile, che viene chiamato come funzione.

Noi ancora non sappiamo cosa fun() funzione ritorna, o se i nomi delle variabili che vengono generati dal suo ritorno sono validi, ma possiamo fare alcune ipotesi, come $var1 e $var2 avrebbe bisogno di essere popolato con i nomi delle funzioni valide a per fare in modo che la vostra linea di codice funzioni.

Ora abbiamo una comprensione dell'intera linea di codice, ma non ancora una visione chiara di ciò che sta cercando di ottenere (oltre ad essere eccessivamente 'intelligente' e ottuso).

Questo è molto molto codice scritto male. È deliberatamente oscuro, e inefficiente (cioè funzionerà lentamente).

3

Verifica il valore restituito della funzione, il cui nome è il valore nella variabile fun("str1") e gli argomenti fun("str2") e il valore della variabile denominata fun("str3").

Esempio:

Se fun("str1") uguale "x", fun("str2") uguale 34, e fun("str3") uguale "y", allora l'istruzione sarà simile:

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

fun("str1") stringa rendimenti che dovrebbe essere il nome della variabile e il valore di questa variabile è la funzione anonima (che probabilmente non è nulla e restituisce il valore booleano) che ottiene prima due argomenti è il valore restituito fun("str2") e il secondo è il valore della variabile con il nome che corrisponde alla stringa restituita da fun("str3").

1

Alcuni lavoro intorno:

$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"