mf/callback-parser

PHP 箭头函数解析器

2.1.0 2018-11-02 09:39 UTC

This package is auto-updated.

Last update: 2024-08-29 04:25:30 UTC


README

Latest Stable Version Build Status Coverage Status Total Downloads License

PHP 箭头函数解析器

此库不再受支持,因为 PHP 7.4 已经原生支持箭头函数 - https://php.ac.cn/manual/en/functions.arrow.php

目录

需求

安装

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 允许的那样编写复杂函数。