| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | <?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Symfony\Component\ExpressionLanguage;/** * Represents a function that can be used in an expression. * * A function is defined by two PHP callables. The callables are used * by the language to compile and/or evaluate the function. * * The "compiler" function is used at compilation time and must return a * PHP representation of the function call (it receives the function * arguments as arguments). * * The "evaluator" function is used for expression evaluation and must return * the value of the function call based on the values defined for the * expression (it receives the values as a first argument and the function * arguments as remaining arguments). * * @author Fabien Potencier <fabien@symfony.com> */class ExpressionFunction{    private $name;    private $compiler;    private $evaluator;    /**     * @param string   $name      The function name     * @param callable $compiler  A callable able to compile the function     * @param callable $evaluator A callable able to evaluate the function     */    public function __construct(string $name, callable $compiler, callable $evaluator)    {        $this->name = $name;        $this->compiler = $compiler instanceof \Closure ? $compiler : \Closure::fromCallable($compiler);        $this->evaluator = $evaluator instanceof \Closure ? $evaluator : \Closure::fromCallable($evaluator);    }    /**     * @return string     */    public function getName()    {        return $this->name;    }    /**     * @return \Closure     */    public function getCompiler()    {        return $this->compiler;    }    /**     * @return \Closure     */    public function getEvaluator()    {        return $this->evaluator;    }    /**     * Creates an ExpressionFunction from a PHP function name.     *     * @param string|null $expressionFunctionName The expression function name (default: same than the PHP function name)     *     * @return self     *     * @throws \InvalidArgumentException if given PHP function name does not exist     * @throws \InvalidArgumentException if given PHP function name is in namespace     *                                   and expression function name is not defined     */    public static function fromPhp(string $phpFunctionName, ?string $expressionFunctionName = null)    {        $phpFunctionName = ltrim($phpFunctionName, '\\');        if (!\function_exists($phpFunctionName)) {            throw new \InvalidArgumentException(sprintf('PHP function "%s" does not exist.', $phpFunctionName));        }        $parts = explode('\\', $phpFunctionName);        if (!$expressionFunctionName && \count($parts) > 1) {            throw new \InvalidArgumentException(sprintf('An expression function name must be defined when PHP function "%s" is namespaced.', $phpFunctionName));        }        $compiler = function (...$args) use ($phpFunctionName) {            return sprintf('\%s(%s)', $phpFunctionName, implode(', ', $args));        };        $evaluator = function ($p, ...$args) use ($phpFunctionName) {            return $phpFunctionName(...$args);        };        return new self($expressionFunctionName ?: end($parts), $compiler, $evaluator);    }}
 |