代码之家  ›  专栏  ›  技术社区  ›  mario

方法链劫持

php
  •  5
  • mario  · 技术社区  · 14 年前

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


    用例:我正在将超全局数据包装成对象。这允许我“强制”输入过滤。$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()的用法,并偷偷摸摸地交换它。这很糟糕。有没有更好的实现方案来执行一个方法列表,一半是我,一半是你?

    1 回复  |  直到 14 年前
        1
  •  2
  •   bobdiaes    14 年前

    $var->array->email_XOR_url;
    $var->array->email->XOR->url;