Метод compile класса ExpressionLanguage
Метод compile класса ExpressionLanguage
преобразует строковое выражение в валидный
PHP-код. Первым параметром передаётся
выражение в виде строки. Вторым параметром
можно передать массив имён переменных,
доступных в выражении. Метод возвращает
строку с готовым PHP-кодом, который можно
сохранить в кеш или выполнить через eval.
В отличие от метода evaluate, который
сразу вычисляет результат, compile только
генерирует код.
Синтаксис
public function compile(string $expression, array $names = []): string
Пример
Давайте скомпилируем простое выражение и посмотрим на результат:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$expressionLanguage = new ExpressionLanguage();
$res = $expressionLanguage->compile('1 + 2');
return new Response($res);
}
}
?>
Результат выполнения кода:
(1 + 2)
Пример
Давайте скомпилируем выражение с переменными, передав их имена вторым параметром:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$expressionLanguage = new ExpressionLanguage();
$res = $expressionLanguage->compile('a + b', ['a', 'b']);
return new Response($res);
}
}
?>
Результат выполнения кода:
($a + $b)
Пример
Давайте скомпилируем выражение и выполним полученный код через eval, чтобы получить результат:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$expressionLanguage = new ExpressionLanguage();
$code = $expressionLanguage->compile('a + b', ['a', 'b']);
$a = 3;
$b = 4;
eval('$res = ' . $code . ';');
return new Response($res);
}
}
?>
Результат выполнения кода:
7
Пример
Давайте скомпилируем выражение с вызовом метода:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$expressionLanguage = new ExpressionLanguage();
$res = $expressionLanguage->compile('user.getName()', ['user']);
return new Response($res);
}
}
?>
Результат выполнения кода:
$user->getName()
Смотрите также
-
класс
ExpressionLanguage,
который позволяет работать с выражениями -
метод
evaluate,
который вычисляет значение выражения -
метод
lint,
который проверяет выражение на ошибки -
метод
register,
который регистрирует новую функцию в языке выражений