Вызов метода в foreach с чистым кодом

Я использую DomDocument для доступа к HTML-странице и преобразования в объект, но каждый раз мне нужно искать узлы с каким-то другим тегом. Я хочу метод с именем логики в качестве параметра, но каждая логика имеет разное количество параметров.

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

Решение

Вот пример от меня,
правила, которые я беру из вашего вопроса:

логическое имя как параметр А ТАКЖЕ используя другой тег

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() метод.
  • Вы можете определить столько логических методов, сколько вам нужно
  • Вы можете использовать метод с логическим именем & тэг или только логика

Но это всего лишь пример того, что можно сделать. Я бы сделал это по-другому, и в настоящее время я не понимаю, какая логика здесь нужна. Мой пример показывает только то, как обрабатывать и разграничивать вызов метода для вложенных методов с различными параметрами.

Имейте в виду, что в примере отсутствуют серверные вещи, такие как обработка ошибок.

Надеюсь, что это дает направление.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector