2017-01-25 7 views
0

私はDomDocumentを使ってHTMLページにアクセスし、オブジェクトに変換しますが、別のタグでノードを検索する必要があるたびに呼び出されます。私は、ロジック名をパラメータとして持つメソッドを必要としますが、各ロジックには異なる数のパラメータがあります。foreachでクリーンコードでメソッドを呼び出す

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'); 

これは、これをコーディングするクリーン/ドライストラテジーのですか?私は重複していくつかの問題の後で学びたい。

ここ
+0

PHPバージョン?あなたは 'Variadic関数'という言葉を知っていましたか?http://php.net/manual/en/functions.arguments.php#functions.variable-arg-listのように 'public function logic1($ node、... $ args)' '$ this-> $ logic($ node、... $ parameters);' – JustOnUnderMillions

+0

という呼出しで私にはうまく見えます。通知やエラーはなく、コードは正常に動作していますか? –

+0

@JustOnUnderMillionsこの作品。これは実際にこれをコード化する最もクリーンな/乾いた方法ですか?私は重複していくつかの問題の後でこれを学ぶ必要があります! –

答えて

0

は、私はあなたの質問から取る ルールは、私からの例です:

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 &タグ名のみlogicname

とメソッドを使用することができます。しかし、これはすべて行うことができるもののためだけの例である

  • を必要とするなど、多くのロジック・メソッドを定義することができます。私はこれを別のやり方で行い、現時点では、ここでどんな種類の論理が必要かを完全には知りません。私の例では、メソッドの呼び出しを異なるパラメータのサブメソッドに処理してデリゲートする方法のみを示しています。

    例には、エラー処理のようなサーバーの機能がないことに注意してください。

    これは方向を示します。

  • +0

    私はHTMLページを持つDOM構造を持っており、構造内の要素を見つけるためにforeachを作るために毎回必要です。 –

    +0

    findClass( 'div_acervo')内の特定の名前 '(new Dom) - >を持つクラスと一致する必要がありますfindClass findTagを使用してロジック ' findClass($ class) {$ this-> findTag( 'match'、$ class);} ''関数の一致($ node、$ class){return preg_match( "/"、$ node-> getAttribute( "class "));} –

    +0

    もう一つのケースでは、( 'tr') - > filter( 'trim'、 'strtolower')のDOM '(new Dom) - >のすべてのノードに2つの関数を適用する必要があります。だから、 "filter"メソッドは "findTag"に "filterLogic"を渡します。 –

    関連する問題