使用干净的代码调用foreach中的方法

时间:2017-01-25 16:08:02

标签: php design-patterns

我使用DomDocument访问HTML页面并转换为Object,但每次我需要搜索具有不同标记的节点时。我想要一个逻辑名称作为参数的方法,但每个逻辑都有不同数量的参数。

public function foo(){
    $this->findTag('bar', $parameters);
}
public function findTag($logic, $parameters){
    foreach ($this->dom->getElementsByTagName($this->tag) as $node) {
        $this->$logic($node, $parameters);
    }
}
public function logic1($node, $foo, $bar){
    //something with $foo and $bar
}
public function logic2($node, $fooBar){
    //something with $fooBar
}

这是一种糟糕的做法?我怎样才能使这个foreach成为一个独特的函数,当需要来自DomObject的一些信息时,总是使用不同的标记调用。

@JustOnUnderMillions评论后工作

class pei
{
    public function classe($nome)
    {
        $this->findTag('logic1', $nome);
    }

    public function classe2($porta, $janela)
    {
        $this->findTag('logic2', $porta, $janela);
    }

    public function findTag($logic, ...$parameters)
    {
        $array = [1, 2, 3, 4];
        print_r($parameters);
        foreach ($array as $node) {
            $this->$logic($node, $parameters);
        }
    }

    public function logic1($node, $nome)
    {
        print_r($node);
        print_r($nome);
    }

    public function logic2($node, $porta)
    {
        print_r($node);
        print_r($porta[0]);
        print_r($porta[1]);
    }
}
(new pei)->classe('pablito');
(new pei)->classe2('janela1', 'janela2');

这是编写此代码的最干净/干燥的策略吗?我想在重复的几个问题之后学习。

1 个答案:

答案 0 :(得分:0)

这是我的一个例子, 我从你的问题中得出的规则:

逻辑名称作为参数 AND 使用不同的标记

class pei
{
    /**
     * @param $logic array|string [logicname,tagname] or "logicname"
     * @param $arguments the argument list for the logic
     **/
    public function findTag($logic,...$arguments)
    {
        if(is_array($logic)){
          list($logic,$tag)=$logic;
        } else {
           $tag=$this->tag;//Note: your example dont show where this is coming from!?
        }

        if(!method_exists($this,$logic)){
            throw new Exception("Logic '$logic' not found!");
        }

        $result=array();
        //Note: Is also unclear where and how $this->dom is set!?
        foreach ($this->dom->getElementsByTagName($tag) as $node) {
          //here we expand the args to $arg0,$arg1,...
          $result[]= $this->{$logic}($node,...$arguments);
        }

        return $result;
    }

    //logic definitions
    public function logic1($node, $arg0){}
    public function logic2($node, $arg0, $arg1){}
    public function logic3($node, $arg0, $arg1, $arg2){}
}

现在我们有一个方法可以根据参数设置委托给另一个方法。

$result = (new pei($Dom))->findTag('logic1','pablito');
$result = (new pei($Dom))->findTag('logic2','janela1', 'janela2');
$result = (new pei($Dom))->findTag(['logic2','tagname'],'janela1', 'janela2');
  • 现在您可以直接调用逻辑方法或使用findTag()方法。
  • 您可以定义所需的逻辑方法
  • 您可以将该方法与logicname&标记名或仅逻辑名

但这只是一个可以做出的例子。我会以另一种方式做到这一点,目前我还没有完全了解这里需要什么样的逻辑。我的示例仅显示如何处理和解析方法调用到不同参数的子方法。

请记住,该示例缺少错误处理等服务器。

希望这会给出一个方向。