方法链劫持

mar*_*rio 5 php

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


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

$_GET->ascii->nocontrol->text["field"]
Run Code Online (Sandbox Code Playgroud)

这是一个方法调用.它使用尖括号.但这只是一个很好的技巧,可以简化重写任何内容$_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;
}
Run Code Online (Sandbox Code Playgroud)

方法堆栈在$this->__filter列表中组装.上面的exec_chain()只是循环遍历它,每次删除第一个方法名称.虚拟_array处理程序通常是第一种方法.它只是窃取了方法堆栈,并重新执行每个数组元素的余数.与上面的示例代码不完全相同,但它只是重复地重新填充原始方法堆栈.

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

所以具体来说,我有兴趣找到一个替代我的$ this - > __过滤器列表用于array_pop()和偷偷摸摸的交换它.这是不好的.是否有更好的实施方案来执行方法列表的一半我 - >半部分你?

bob*_*aes 2

我之前制作过类似的链接接口,我喜欢你在 GET/POST 变量上使用它的想法。

我认为你做类似的事情会更好

$var->数组->email_XOR_url;
而不是
$var->数组->电子邮件->异或->url;
。这样你就可以用 __get/__call 魔法捕捉各种组合。