icio/scope

0.4 2014-09-25 20:54 UTC

This package is not auto-updated.

Last update: 2024-09-24 03:08:07 UTC


README

Scope 提供了一种机制,用于在回调过程中准备全局环境和容器,将状态变更和清理仅限于代码中的声明。灵感来自 Python 的原生 with 语句。

例如,您可以使用以下方式替代

global $x;
$xBackup = $x;
$x = $xNew;
$done = do_it();
$x = $xBackup;

with KeyState 设置数组键状态

(new KeyState($GLOBALS, array("x" => $newX)))->call('do_it');

目前可用的作用域可以帮助

  • 使用 Scope 收集多个作用域;
  • 使用 KeyState 在数组上设置临时值;
  • 使用 Buffer 捕获函数输出;
  • 使用 WorkingDirectory 切换到新目录;
  • 以及使用 ErrorReporting 关注不同的错误级别。

有时您可能需要在特定作用域中跳进跳出,通过跟踪您的操作引起的变更来提供默认上下文。作用域可以可选地处理这种情况。例如,Buffer 可以收集多会话的输出;WorkingDirectory 在重新进入时可以回到离开的目录;KeyState 可以跟踪键值,如果它们在作用域内被更改;以及 ErrorReporting 可以跟踪报告的任何变更。请参阅规范测试以获取详细信息。

所有输入的作用域都会作为函数参数传递给回调。例如,当与输出缓冲区一起工作时,您可以如此捕获并返回输出

$output = (new Scope(
    new Buffer(Buffer::CLEAN),
    new WorkingDirectory("./old")
))->call(function(Buffer $buffer) {
    require "old-script.php";
    return $buffer->getContents();
});

如果在回调期间抛出异常,我们将关闭作用域并重新抛出异常。如果作用域抛出异常,我们将清理任何已输入的作用域并重新抛出异常。在尝试退出作用域时抛出的异常将阻止清理其他作用域(这可能需要改变)。