eventjet / ausdruck
A small expression engine for PHP
Installs: 7
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 2
Forks: 0
Open Issues: 5
pkg:composer/eventjet/ausdruck
Requires
- php: >=8.3
- ext-ctype: *
Requires (Dev)
- amphp/dns: ^2.4
- amphp/socket: ^2.3.1
- beberlei/assert: ^3.3.3
- composer/pcre: ^3.3
- eventjet/coding-standard: ^3.12
- friendsofphp/php-cs-fixer: ^3.88
- infection/infection: ^0.31.2
- maglnet/composer-require-checker: ^4.16
- phpstan/extension-installer: ^1.3
- phpstan/phpstan: ^2.1.29
- phpstan/phpstan-phpunit: ^2.0
- phpstan/phpstan-strict-rules: ^2.0
- phpunit/phpunit: ^12.3
- psalm/plugin-phpunit: ^0.19.5
- roave/backward-compatibility-check: ^8.14
- vimeo/psalm: ^6.13
- 0.2.x-dev
- 0.2.4
- 0.2.3
- 0.2.2
- 0.2.1
- 0.2.0
- 0.1.7
- 0.1.6
- 0.1.5
- 0.1.4
- 0.1.3
- 0.1.2
- 0.1.1
- v0.1.0
- dev-operator-precedence
- dev-update-static-analyzers
- dev-value-declaration-statements
- dev-php8.4
- dev-bytes
- dev-operators-as-functions
- dev-master
- dev-remove-object-type-2
- dev-structs
- dev-remove-object-type
- dev-php-transpiler
- dev-variable-declarations
- dev-track-position
This package is auto-updated.
Last update: 2025-10-16 05:01:35 UTC
README
A small expression engine for PHP.
Quick start
composer require eventjet/ausdruck
use Eventjet\Ausdruck\Parser\ExpressionParser; use Eventjet\Ausdruck\Parser\Types; use Eventjet\Ausdruck\Type; $expression = ExpressionParser::parse( 'joe:MyPersonType.name:string()', new Types(['MyPersonType' => Type::listOf(Type::string())]), ); $scope = new Scope( // Passing values to the expression ['joe' => ['joe']], // Custom function definitions ['name' => static fn (array $person): string => $person[0]], ); $name = $expression->evaluate($scope); assert($name === 'Joe');
Documentation
Accessing scope variables
Syntax: varName:type
Scope variables are passed from PHP when it calls evaluate() on the expression:
use Eventjet\Ausdruck\Parser\ExpressionParser; use Eventjet\Ausdruck\Scope; $x = ExpressionParser::parse('foo:int') ->evaluate(new Scope(['foo' => 123])); assert($x === 123);
Examples
foo:int, foo:list<string>
See Types
Literals
- 123: Integer
- "foo": String
- 1.23: Float
- [1, myInt:int, 3]: List of integers
- ["foo", myString:string, "bar"]: List of strings
Operators
Both operands must be of the same type.
| Operator | Description | Example | Note | 
|---|---|---|---|
| === | Equality | foo:string === "bar" | |
| - | Subtraction | foo:int - bar:int | Operands must be of type intorfloat | 
| > | Greater than | foo:int > bar:int | Operands must be of type intorfloat | 
| || | Logical OR | foo:bool || bar:bool | Operands must be of type bool | 
| && | Logical AND | foo:bool && bar:bool | Operands must be of type bool | 
Where's the rest? We're implementing more as we need them.
Types
The following types are supported:
- int: Integer
- string: String
- bool: Boolean
- float: Floating point number
- list<T>: List of type T
- map<K, V>: Map with key type K and value type V
- Any other type will be treated as an alias that you will have to provide when parsing the expression:
use Eventjet\Ausdruck\Parser\ExpressionParser; use Eventjet\Ausdruck\Type; ExpressionParser::parse('foo:MyType', ['MyType' => Type::alias(Type::listOf(Type::string()))]); 
Functions
Syntax: target.functionName:returnType(arg1, arg2, ...)
The target can be any expression. It will be passed as the first argument to the function.
Example
haystack:list<string>.contains:bool(needle:string)
Built-In Functions
| Function | Description | Example | 
|---|---|---|
| count | Returns the number of elements in a list | foo:list<string>.count:int() | 
| contains | Returns whether a list contains a value | foo:list<string>.contains:bool("bar") | 
| head | Returns the first element of a list as an Option | foo:list<string>.head:Option<string>() | 
| isSome | Takes an Option and returns whether it is Some | foo:Option<int>.isSome:bool() | 
| map | Returns a new list with the results of applying a function | foo:list<int>.map:list<int>(|i| i:int - 2) | 
| some | Returns whether any element matches a predicate | foo:list<int>.some:bool(|item| item:int > 5) | 
| substr | Returns a substring of a string | foo:string.substr:string(0, 5) | 
| tail | Returns all elements of a list except the first | foo:list<string>.tail:list<string>() | 
| take | Returns the first n elements of a list | foo:list<string>.take:list<string>(5) | 
| unique | Returns a list with duplicate elements removed | foo:list<string>.unique:list<string>() | 
Custom Functions
You can pass custom functions along with the scope variables:
use Eventjet\Ausdruck\Parser\ExpressionParser;use Eventjet\Ausdruck\Scope; $scope = new Scope( ['foo' => 'My secret'], ['mask' => fn (string $str, string $mask) => str_repeat($mask, strlen($str))] ); $result = ExpressionParser::parse('foo:string.mask("x")')->evaluate($scope); assert($result === 'xxxxxxxxx');
The target of the function/method call (foo:string in the example above) will be passed as the first argument to the
function.
Lambdas
Syntax: |arg1, arg2, ... | expression
To access an argument, you must specify its type, just like when accessing scope variables.
Example
|item| item:int > 5