TypePHP 编译器
https://swoole.com/aot/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
21 lines
1.4 KiB
21 lines
1.4 KiB
# yield / generator 限制
|
|
|
|
TypePHP 的 generator 基于 PHP Fiber 运行。generator 函数或方法会返回 `TypePHP\FiberGenerator`,该对象实现 `Iterator`,但不是 PHP 内置 `Generator` 实例。
|
|
|
|
## 不支持
|
|
|
|
- 不支持声明返回类型为 `Generator`;请使用 `Iterator`、`Traversable`、`iterable`、`mixed`,或省略返回类型。
|
|
- 不支持按引用返回的 generator,例如 `function &gen() { yield 1; }`。
|
|
- 不支持 generator 参数按引用传递。
|
|
- 不支持 generator 可变参数。
|
|
- 不支持 by-reference yield 语义。
|
|
- 不支持在动态 PHP 脚本中使用 `foreach` 直接遍历 TypePHP Native generator 返回的 `TypePHP\FiberGenerator`。
|
|
- 不保证 `instanceof Generator`、`ReflectionGenerator`、`Generator` 内部实现细节与 Zend 原生 generator 兼容。
|
|
|
|
## 受限行为
|
|
|
|
- `yield from` 可以转发数组和 `Traversable` 的 key/value;委托对象是 generator 时可以读取其 return value。
|
|
- `yield from` 的 `send()`/`throw()` 委托透传仍属于受限场景,复杂协程式双向通信应避免依赖。
|
|
- TypePHP Native `foreach` 可以遍历动态 PHP 返回的 Zend 原生 generator;反向由 ZendVM `foreach` 驱动 TypePHP Native generator 暂不支持。
|
|
- generator 的执行依赖 Fiber;如果当前 PHP 运行环境禁用或缺失 Fiber,则无法运行。
|
|
- generator body 在 Fiber 内执行,析构、异常传播、force-close 与 Zend 原生 generator 可能存在边界差异。
|
|
|