Php 方法链劫持

Php 方法链劫持,php,Php,这不是一个真正流畅的界面。我有一个构建方法堆栈的对象。它由单个函数调用执行。但现在我可能会添加另一个虚拟方法,它“接管”了该方法堆栈 用例:我正在将超全局性包装到对象中。这允许我“强制”输入过滤$_GET和co提供简单的消毒方法。我的新版本现在允许原子过滤器的链接。例如: $_GET->ascii->nocontrol->text["field"] 这是一个方法调用。它使用尖括号。但这只是一个很好的技巧,可以简化重写$\u GET[“field”]的任何操作。无论如何 现在

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


用例:我正在将超全局性包装到对象中。这允许我“强制”输入过滤$_GET和co提供简单的消毒方法。我的新版本现在允许原子过滤器的链接。例如:

$_GET->ascii->nocontrol->text["field"]
这是一个方法调用。它使用尖括号。但这只是一个很好的技巧,可以简化重写
$\u GET[“field”]
的任何操作。无论如何

现在,偶尔也会出现带有枚举字段的表单,如字段[0]、字段[1]、字段[2]。这就是我添加虚拟->数组过滤器方法的原因。它劫持收集的方法堆栈,并对剩余的过滤器进行迭代,例如$\u POST数组值。例如
$\u 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->\uu过滤器
列表中组装。上面的exec_chain()只是在它上面循环,每次删除第一个方法名。虚拟数组处理程序通常是第一种方法。它只是窃取该方法堆栈,并重新执行每个数组元素上的剩余部分。与上面的示例代码不完全相同,但它只是重复地重新填充原始方法堆栈

它起作用了。但感觉有点不干净。我正在考虑添加另一个虚拟方法
->xor
。(YAGNI?),它不仅会在字段上迭代,还会评估替代过滤器是否成功。例如
$\u请求->数组->异或->电子邮件->url[“字段”]
。我想知道是否有更好的模式来劫持函数列表。我当前的钩子列表($this->\u filter)交换不适合链接。嗯,实际上,->xor示例不需要像->数组那样迭代/行为


具体来说,我想找到一个替代$this->\uuuu过滤器列表的方法,使用array\u pop()并偷偷地将其替换掉。这很糟糕。有没有更好的实现方案来执行方法列表半部分我->半部分你?

我以前做过类似的链接接口,我喜欢你在GET/POST vars上使用它的想法


我认为你最好还是做一些像$var->array->email\uxor\uurl;而不是$var->array->email->XOR->url;。这样你就可以用你的uu-get/u-call-magic捕捉到各种组合。

你的要求并不明确。即使你明确表示你不是在问这个部分,也很难不下意识地对“流畅的界面”做出反应,并建议你做些别的事(!)。嘎,该死的进入提交,但只在评论框中再次咬我。。。。您是否可以在您认为需要更智能的东西的用例上进行扩展。从我对你粘贴的代码的了解来看,你已经得到了一些你想要的东西,这并不可怕——我更反对流畅的界面而不是实现。好吧,它是有效的。但是钩子列表热交换看起来真的很肮脏。客观上,这只是一个特征性问题,不确定我是否真的需要新的虚拟方法。它是可以由应用程序逻辑处理的,它只感觉属于输入处理程序。无论如何,如果我需要->xor或其他一些新功能,我当然需要摆脱并发数组操作。这是我问题的重点。顺便说一句,我的流畅界面说明。我说这实际上不是一个流畅的界面。这些方法实际上并不连锁。它基本上捕获属性访问,从而建立我的$\uu过滤器链方法堆栈。一个有趣的副作用:如果我第一次写一个非语句,比如
$\u GET->name->text
它将保存一个过滤器链,如果我访问
$\u get[“field”]
,它将首先应用。让我想起了我最近写的一个jQuery插件。这不是我想要的。但是,我将采用这种方法,而不是进一步使代码复杂化。在_调用中管理此功能肯定比添加另一个解决方案简单。或者我甚至可以尝试一个简单的
->xor(var,filter1,filter2,filter3)
方法。是的,我也不喜欢它。使用$var->array->xor('email','url')似乎是最好的选择。实际上,我认为你应该去掉数组过滤器,因为它总是位于位置1。只需在构造函数中翻转一个开关即可。如果开关打开,那么任何链都将应用于每个数组成员。我会投票支持xor()-as-a-function方法,因为我过去也经常使用它。 $var->array->email_XOR_url; $var->array->email->XOR->url;