这不是一个
真实的
流畅的界面。我有一个构建方法堆栈的对象。通过单个函数调用执行。但现在我可以添加另一个虚拟方法,它“接管”那个方法堆栈。
用例:我正在将超全局数据包装成对象。这允许我“强制”输入过滤。$GET和CO提供简单的消毒方法。我的新版本现在允许链接原子过滤器。例如:
$_GET->ascii->nocontrol->text["field"]
这是一个方法调用。它使用尖括号。但这只是一个很好的技巧,它可以让重写
$_GET["field"]
. 不管怎样。
现在也有一些带有枚举字段的表单,如字段[0]、字段[1]、字段[2]中的表单。这就是为什么我添加了一个虚拟数组过滤方法。它劫持所收集的方法堆栈,并对剩余的过滤器进行迭代,例如,$后置数组值。例如
$_POST->array->int["list"]
.
稍微缩短了实施时间:
function exec_chain ($data) {
...
while ($filtername = array_pop($this->__filter)) {
...
$data = $this->{"_$filtername"} ($data);
...
}
function _array($data) {
list($multiplex, $this->__filter) = array($this->__filter, array());
$data = (array) $data;
foreach (array_keys($data) as $i) {
$this->__filter = $multiplex;
$data[$i] = $this->exec_chain($data[$i]);
}
return $data;
}
方法堆栈在
$this->__filter
名单。上面的exec_chain()只是循环它,每次移除第一个方法名。虚拟数组处理程序通常是第一个方法。它只是窃取该方法堆栈,然后在每个数组元素上重新执行其余的部分。与上面的示例代码不完全相同,但它只是重复地重新填充原始方法堆栈。
它起作用了。但感觉有点不干净。我正在考虑添加另一个虚拟方法
->xor
. (雅尼?)它不仅会遍历字段,而且会评估备用过滤器是否成功。例如
$_REQUEST->array->xor->email->url["fields"]
. 我想知道是否有更好的模式来劫持函数列表。我当前的钩子列表($this->uu filter)交换不适合链接。嗯,事实上,->xor示例不需要迭代/行为完全类似于--gt;数组。
因此,我特别想找到一个替代我的$this->uuu过滤器列表与array_pop()的用法,并偷偷摸摸地交换它。这很糟糕。有没有更好的实现方案来执行一个方法列表,一半是我,一半是你?