我使用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');
这是编写此代码的最干净/干燥的策略吗?我想在重复的几个问题之后学习。
答案 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()
方法。但这只是一个可以做出的例子。我会以另一种方式做到这一点,目前我还没有完全了解这里需要什么样的逻辑。我的示例仅显示如何处理和解析方法调用到不同参数的子方法。
请记住,该示例缺少错误处理等服务器。
希望这会给出一个方向。