Вызов пользовательских функций в PHP eval ()

Я выполнял php-тестирование, которое использует функцию eval (), но кажется, что eval () не может правильно вызывать пользовательские функции.

См. Мой пример:

function equals($a,$b){ if ($t == $r){ return true; } else{ throw new Exception("expected:<".$r."> but was:<".$t.">"); } } eval("$test = 1;"); try{ echo eval("equals($test,1);"); } catch (Exception $e) { echo $e->getMessage(); } 

но то, что я получил, всегда похоже на «ожидаемое: <1>, но было: <>», но если я сделаю

 echo $test; 

Я могу получить 1.

Я попытался изменить $ to \ $, следуя руководству PHP eval (), но, похоже, он нарушает функцию eval. ( http://php.net/manual/en/function.eval.php )

Так что теперь я немного стекаюсь, может кто-то поможет мне в этой проблеме. Большое спасибо.

вам не хватает return

 echo eval("return equals(\"$test\",1);"); 

Из руководства по PHP

eval () возвращает NULL, если в вычисленном коде не вызван возврат, и в этом случае возвращается значение, переданное в return. Если в оцененном коде есть ошибка синтаксического анализа, eval () возвращает FALSE, и выполнение следующего кода продолжается нормально.

Eval ()

избегать использования eval (), как предложил @Delan.

Не используйте eval() .

Если вы хотите вызвать пользовательскую функцию, скажем, derp , с именем во время выполнения:

 $functionName = 'derp'; $functionName(argument1, argument2, ...); 

Обратите внимание, как я префикс functionName с $ поэтому я не derp functionName а скорее derp .

Итак, для вашего примера, вызывая пользовательскую функцию, equals :

 $functionName = 'equals'; $functionName($test, 1); 

Если вы хотите использовать eval, я считаю, что проблема в том, что вам нужно избежать обоих $ (это было не ясно из вашего поста, если вы это сделали). Таким образом, ваш код будет читать

  function equals($a,$b){ if ($t == $r){ return true; } else { throw new Exception("expected:<".$r."> but was:<".$t.">"); } } eval("\$test = 1;"); try{ echo eval("equals(\$test,1);"); } catch (Exception $e) { echo $e->getMessage(); } 

Вы также можете использовать одинарные кавычки для ваших строк eval, которые не оценивают переменные. Как указывали другие, однако, могут быть лучшие способы сделать это.