方法链劫持

时间:2010-10-03 00:22:17

标签: php

这不是真正的流畅的界面。我有一个构建方法堆栈的对象。哪个由单个函数调用执行。但现在我可能会添加另一个虚拟方法,它“接管”该方法堆栈。


使用案例:我将超级全球包裹在物体中。这允许我“强制”输入过滤。 $ _GET和co提供简单的消毒方法。而我的新版本现在允许链接原子过滤器。例如:

$_GET->ascii->nocontrol->text["field"]

这是方法调用。它使用尖括号。但这只是一个很好的技巧,可以轻松重写$_GET["field"]的任何内容。反正。

现在偶尔还有枚举字段的表单,如字段[0],字段[1],字段[2]。这就是我添加虚拟 - >数组滤镜方法的原因。它劫持了收集的方法堆栈,并在其上迭代剩余的过滤器。 $ _POST数组值。例如$_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()只是循环遍历它,每次删除第一个方法名称。虚拟_array处理程序通常是第一种方法。它只是窃取了方法堆栈,并重新执行每个数组元素的余数。与上面的示例代码不完全相同,但它只是重复填充原始方法堆栈。

有效。但感觉有点不干净。我正在考虑添加另一个虚拟方法->xor。 (YAGNI?)哪个不会迭代字段,而是评估备用过滤器是否成功。例如$_REQUEST->array->xor->email->url["fields"]。我想知道是否有更好的劫持功能列表模式。我当前的钩子列表($ this-> __ filter)交换不适合链接。嗯,实际上, - > xor示例不需要迭代/行为完全像 - >数组。

具体来说,我有兴趣找到一个替代我的$ this-> __过滤器列表用于array_pop()并偷偷摸摸地将其交换掉。这是不好的。有没有更好的实现方案来执行方法列表半部分我 - >你的一半是什么?

1 个答案:

答案 0 :(得分:2)

之前我做过类似的链接界面,我喜欢你在GET / POST变种上使用它的想法。

我认为你最好做一些像

$var->array->email_XOR_url;
而不是
$var->array->email->XOR->url;
这样的事情。这样你就可以用__get / __调用魔法来捕捉各种组合。