mf / callback-parser
PHP 箭头函数解析器
2.1.0
2018-11-02 09:39 UTC
Requires
- php: ^7.1
- ext-mbstring: *
- beberlei/assert: ^2.7 || ^3.0
Requires (Dev)
- lmc/coding-standard: ^1.1
- php-coveralls/php-coveralls: ^2.1
- phpstan/phpstan-shim: ^0.10
- phpunit/phpunit: ^7.0
README
PHP 箭头函数解析器
此库不再受支持,因为 PHP 7.4 已经原生支持箭头函数 - https://php.ac.cn/manual/en/functions.arrow.php
目录
需求
- PHP 7.1
eval()
函数用于解析 箭头函数
安装
composer require mf/callback-parser
箭头函数
使用方法
$callbackParser = new CallbackParser(); $callback = $callbackParser->parseArrowFunction('($a, $b) => $a + $b'); var_dump($callback(2, 3)); // int 5
带有自定义异常
$callbackParser = new CallbackParser(App\MyCustomException::class); $callbackParser->parseArrowFunction('invalid'); // throws App\MyCustomException
它是如何工作的?
- 它将函数从字符串解析出来,并使用
eval()
进行评估
可能是什么鬼?
此解析器可以将箭头函数解析成 PHP 以执行,但这可能比简单的 eval
要复杂一些。您可以查看 CallbackParserTest::provideInvalidFunction()
以获取示例。
参数的命名空间
例如,给定参数类型的类命名空间。
(SimpleEntity $entity) => $entity->getId()
上面的示例显示了一个要解析的 INVALID
箭头函数(尚未解析?)。这是一个无效的原因更多。
- 回调在其他作用域中被解析和
eval
,在那里您提供了这样的回调 - 因此,
CallbackParser
不知道SimpleEntity
的完整类名
还有更多方法可以“修复”它,例如
- 您可以注册允许的参数类型的类映射,解析器可以找到相关的一个并使用映射中的完整类名,但据我看来,这可能比应该更复杂
- 解析器还可以在您的整个项目中找到相关的类,并神奇地使用最相关的一个,但这是一种黑暗魔法,我宁愿避免它
问题是 - 这是否真的有必要?
我不这么认为。因为 PHP 非常强大(弱),即使您不知道它们是什么,也允许您使用对象的类方法。但鉴于此解析器的原始目的是解析 Collections 中的回调,您有其他方法知道并验证参数中的对象类型,因此您可以立即使用这些方法。
$list = new Generic\ListCollection(SimpleEntity::class); $list->add(new SimpleEntity(1)); $list->add(new SimpleEntity(2)); $ids = $list->map('($entity) => $entity->getId()'); var_dump($ids); //array (size=2) // 0 => int 1 // 1 => int 2
简单更简单,但仍然复杂 - 80:20
据我所知,这个解析器允许您简单地解析简单函数,同时您仍然可以像 PHP 允许的那样编写复杂函数。