chain / core
_Chain_ 是自由。
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: 4.4.4
This package is not auto-updated.
Last update: 2024-09-28 17:07:21 UTC
README
###_Chain_ 是自由。 _Chain_ 是一个旨在优化线性处理的库。####简而言之 _Chain_ 的起源是对大多数现代应用程序遵循线性请求/响应模式的观察,其中 RESTful API 领先。
_Chain_ 旨在使此类应用程序易于编码、测试、调试和维护。
在 _Chain_ 环境中,程序的每个步骤都是一个 _Link_。一个 _Link_ 是一个具有单个 EXE()
函数的类,旨在完成单个任务。
在函数式编程的精神下,目标是尽可能多地重用代码,希望使新应用程序的设计尽可能简单,就像链接链一样。
真正的组合方式,_Chain_ 也是一个 _Link_,这使得构建中间组件变得容易。
####I_O 访问者
I_O
访问者就像一个在 _Chain_ 中运行的信号。
为了实现这个目标,将 _Link_ 的 EXE()
方法设置为接收一个输入/输出访问者,或 I_O
访问者,并在对其内存中的数据进行更改后返回它。
将 I_O
对象视为一个袋子。进入一个 _Link_ 时,I_O
对象的内容将在 EXE()
方法内部清空。该方法使用这些成分,并将结果产品放入袋子中。
_Chain_ 负责将 I_O
对象从一个个 _Link_ 传递到下一个 _Link_,除非 _Link_ 希望通过将其 _X_()
方法设置为返回 TRUE
来打破 _Chain_。
在 _Chain_ 的末尾,I_O
访问者包含最终结果。
####示例 让我们创建一个简单的 _Chain_,旨在格式化字符串。
#####安装
$ composer require chain/core
#####导入字符串库
$ composer require chain/string
当然,直接安装 chain/string
会自动导入 chain/core
。此额外步骤是为了清晰。
#####创建 I_O 对象
// This example assumes we're in the _Chain_ namespace for clarity. $IO = new IO(' tHis sTRinG IS a meSS! ');
#####创建 _Chain_
$chain = new Chain(); $chain->ADD(new String\_Whitespace_()) ->ADD(new String\_Lowercase_());
#####执行
$chain->EXE($IO);
#####结果
$result = $IO->I_(Type::STRING); // $result = 'this string is a mess!'
####依赖注入 显然,_Chain_ 在依赖注入环境中更有用,例如在 Symfony 中。
可以使用由基本 _Links_ 组成的 _Chain_ 创建复杂的服务,并将它们注入到您的控制器或类中。
在未来,我们可能会使用 _Chain_ 构建一个完整的框架,但我们需要一个更大的 _Link_ 库来实现这一目标。####在 _Link_ 内部 这是 _Link_ 内部的 EXE()
方法的示例
// Division public function EXE(I_O $IO){ $numerator = $IO->I_(Type::NUMBER); $denominator = $IO->I_(Type::NUMBER); return $IO->_O($numerator/$denominator); }
#####输入
使用方法 I_($type, $optional=false)
获取输入变量。每次调用该方法时,都会检索下一个变量。
从 I_O
访问者请求的变量必须按正确的顺序排列,并且具有正确的类型。请求不存在或不正确的变量将触发异常。
因此,I_O
访问者不是可迭代的。每个 I_()
调用都必须提供有效的类型常量或类 FQCN。
此设计有效地增强了类型安全性,缓解了PHP最被批评的缺点之一。
然而,在生产环境中,如果一个_Chain_经过了适当的测试,则可以绕过内部类型检查以提升性能
$IO = new IO('foo'); $IO->prod(true);
所有有效的类型常量均列在静态类型类中。
每个_Link_的EXE()
方法的PHP文档中应包含I/O合约。
/** * Method action. * * Description. * * I/O contract * ------------ * <pre> * I string Optional description. * ... as many inputs as needed. * O number Optional description. * ... as many outputs as needed. * X yes/no Breaks the chain if ... * </pre> */ public function EXE(I_O $IO);
##### 输出 I_O
访问者的输出通过调用_O()
方法设置,可以传递无限数量的参数。
调用此方法实际上清除了I_O
访问者的内部内存,并用_O()
方法参数传递的每个值替换。
这些新值将在下一个_Link_中返回,每次调用I_()
方法。
$IO->_O('foo', 56, ['bar', 'baz'], $object); // In the next link: $IO->I_(Type:STRING); // Returns 'foo' $IO->I_(Type:NUMBER); // Returns 56 $IO->I_(Type:MULTI); // Returns array('bar', 'baz) $IO->I_('MyApp\MyClass'); // Returns the MyApp\MyClass object
更新I_O
访问者的内部状态后,_O()
方法返回访问者本身,这使得以下快捷方式成为可能。
public function EXE(I_O $IO) { return $IO->_O('foo'); }
当然,PHP通过引用传递对象,这表明在_Chain_执行中不需要返回I_O
对象。然而,这是_Link_接口的明确要求,并且可以在操作_Chain_时实现以下快捷方式。
$result = $chain->EXE($IO) ->I_(Type:STRING);
#### 理想世界 如果我们想象一个足够大的_Link_库,足以覆盖大多数应用需求,我们可以轻松地将整个库移植到许多语言中,包括汇编语言,并使应用程序能够在不使用图形界面的情况下以语言无关的方式设计。
此类解决方案将在未来得到广泛应用,以解决当前编程语言爆炸式增长的问题。