PHP: call_user_func_array() с цепочкой вызовов и PHPQuery?

Привет хабросообщество. Надеюсь на вашу помощь в решении проблемы:

Нормальный код примерно выглядит так:
$hentry = $document->find('a.pages');
foreach ($hentry as $element) {
		$_urls[]=pq($element)->attr('href')->html();
}



В виду «архитектурных» решений понадобилось реализовать следующий «финт ушами» на PHP:


У нас есть переменная!!! в виде:
$var="pq($element)->attr('href')->html()";

то есть в ней хранится цепочка вызовов методов класса.

Собственно вопрос прост: как «вызвать» всю эту цепочку?


Вроде ответ прост — можно использовать eval:
$var=eval("pq($element)->attr('href')->html();"); но он сыпется с ошибкой:
Object of class DOMElement could not be converted to string
, хотя тот же код вызванный напрямую работает прекрасно:
$var=pq($element)->attr('href')->html();


Как я понимаю call_user_func_array() впринципе не поддерживает цепочки вызовов с аргументами. Есть еще ReflectionFunction но пока не понял с какой стороны подходить к нему
  • Вопрос задан
  • 3431 просмотр
Решения вопроса 1
romy4
@romy4
Exception handler
why not?

<?php
$element = (object)array();

function pq($e)
{
  return new M($e);
}


class M 
{
public function __construct($e) { }
public function attr($a) { return $this; }
public function html() { return "OK"; }
}

$var='pq($element)->attr(\'href\')->html()';

eval('$out='.$var.";");

var_dump($out);


result: OK

чем вам eval() не угодил? Ну да, в данном случае не DOMDocument, дело же не в eval.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@aretmy
А может такое быть, что просто $element в двойных кавычках воспринимается как объект на стадии формирования строки. Заэкранируйте $. Мне так кажется :-)
Ответ написан
@cat_crash Автор вопроса
del
Ответ написан
Комментировать
nazarpc
@nazarpc
Open Source enthusiast
Если цепочки не работают — сделайте разбор строки на элементы, и через обертку вызывайте элементы цепочки по одному.
Ответ написан
Комментировать
bredmm
@bredmm
как вам уже написали выше $element в строке заменяется на значение переменной $element, и выполняет, и именно поэтому все и падает, все это описано в мануале
php.net/manual/en/language.types.string.php
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы