Il vostro esempio eval manca il valore di ritorno:
print eval("return $sItem;");
dovrebbe farlo:
$aData['test'] = 'foo';
$sItem = '$aData[\'test\']';
print eval("return $sItem;"); # foo
Ma non è consigliabile usare eval normalmente. Puoi andare nella cucina dell'inferno con esso perché eval è malvagio.
Invece basta analizzare la stringa e restituiscono il valore:
$aData['test'] = 'foo';
$sItem = '$aData[\'test\']';
$r = sscanf($sItem, '$%[a-zA-Z][\'%[a-zA-Z]\']', $vName, $vKey);
if ($r === 2)
{
$result = ${$vName}[$vKey];
}
else
{
$result = NULL;
}
print $result; # foo
Questo può essere fatto con qualche altra forma di espressione regolare pure.
Come la sintassi è molto vicino a PHP una realtà un sottoinsieme di esso, c'è qualche alternativa si può fare se si desidera convalidare l'ingresso prima di utilizzare eval. Il metodo è di controllare i token PHP e consentire solo un sottoinsieme. Questo non convalida la stringa (sintassi per esempio e se una variabile è in realtà costituito), ma rende più rigoroso:
function validate_tokens($str, array $valid)
{
$vchk = array_flip($valid);
$tokens = token_get_all(sprintf('<?php %s', $str));
array_shift($tokens);
foreach($tokens as $token)
if (!isset($vchk[$token])) return false;
return true;
}
Devi solo dare una serie di gettoni validi per quella funzione. Quelli sono i gettoni di PHP, nel tuo caso questi sono:
T_LNUMBER (305) (probably)
T_VARIABLE (309)
T_CONSTANT_ENCAPSED_STRING (315)
È quindi solo può usare e funziona con le chiavi più complicate così:
$aData['test'] = 'foo';
$aData['te\\\'[]st']['more'] = 'bar';
$sItem = '$aData[\'test\']';
$vValue = NULL;
if (validate_tokens($sItem, array(309, 315, '[', ']')))
{
$vValue = eval("return $sItem;");
}
Ho usato questo in another answer della questione reliably convert string containing PHP array info to array.
@all: grazie a tutti voi ragazzi, da quello che im intenzione di fare (nel quadro generale), è la migliore soluzione per me per usare la funzione eval ... mi dimentico di usare il ritorno – nabizan