98 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
| <?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;
 | |
|         $this->evaluator = $evaluator;
 | |
|     }
 | |
| 
 | |
|     public function getName()
 | |
|     {
 | |
|         return $this->name;
 | |
|     }
 | |
| 
 | |
|     public function getCompiler()
 | |
|     {
 | |
|         return $this->compiler;
 | |
|     }
 | |
| 
 | |
|     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);
 | |
|     }
 | |
| }
 |