Цикл по ссылкам на переменные в вызове функции PHP - PullRequest
1 голос
/ 04 февраля 2020

Я не знаю, возможно ли это вообще.

Я полностью осознаю, что если $stringname = 'Rating', то $stringname() будет таким же, как вызов функции Rating(). Я также знаю, что если $stringname = 'size', то ${$stringname} будет таким же, как $size. Мои мысли зависят от этих фактов.

Я пытаюсь сделать вызов функции XML для PHP, чтобы вставить результаты функции в некоторый текст.

Два примера этого вызова функции XML:

<Function name="ListCensors">
    <Arg name="pginf" />
    <Arg value="/Lib:MainPage/child::*[self::Lib:Page or self::Lib:Series]/@rating" />
    <Arg value="//Gen:Ratings/Gen:Rating[contains(|InsertList|,@code)]" />
</Function>

и

<Function name="RatingImage">
    <Arg value="Web_G" />
    <Arg value="m" />
</Function>

Вы заметите, что они имеют разное количество аргументов (RatingImage() имеет два , в то время как ListCensors() имеет три), и что первый аргумент для вызова функции ListCensors() имеет имя атрибута (pginf) вместо значения. Это связано с тем, что хотя значение атрибута передает строку, имя атрибута относится к имени переменной, уже определенной в PHP. Итак, вот PHP, который в настоящее время не работает.

$func = $maintxt_child->getAttribute('name');
$func_arg_els = $maintxt_child->getElementsByTagName('Arg');


$func(for($func_arg_el_num = 0; $func_arg_el_num < $func_arg_els->length; $func_arg_el_num++){
    if($fun_arg_els->item($func_arg_el_num)->hasAttribute('value')){
        $func_arg_els->item($func_arg_el_num)->getAttribute('value')
    } else {
        ${$func_arg_els->item($func_arg_el_num)->getAttribute('name')}
    }
});

То, что я пытаюсь - и не могу - осуществить, - это настроить что-то, где элемент <Function> может обратитесь к ЛЮБОЙ функции PHP, которую я определил, и l oop через элементы Arg, чтобы отправить правильную информацию этим PHP функциям. Как бы правильно сделать это? Если это невозможно, дайте мне знать, чтобы я мог придумать разные способы ведения дел. Спасибо.

1 Ответ

0 голосов
/ 04 февраля 2020

Я думаю, что это дает вам то, что вы ищете, есть некоторые потенциальные проблемы, которые я рассмотрю в конце.

В этом примере я просто вызываю функцию Test() со значением и Переменная. Поскольку у меня определена только одна функция, идея состоит в том, чтобы найти соответствующую функцию и затем извлечь параметры в массив со всеми значениями. Затем, когда все они извлечены, просто вызовите функцию с этим массивом $parameters и используйте оператор распаковки массива (...), чтобы развернуть их в отдельные значения ...

$def = '
<ListFn>
    <Function name="Test">
        <Arg value="Web_G" />
        <Arg name="m" />
    </Function>
</ListFn>';

$dom = new \DOMDocument();
$dom->loadXML($def);

// Test function to call
function Test(string $a, string $b) {
    echo "{$a}->{$b}".PHP_EOL;
}

// Set up a variable for the call
$m = "1234";

// Just use the first Function definition
$fn = $dom->getElementsByTagName("Function")[0];
// Function name
$func = $fn->getAttribute('name');
// Extract parameters
$parameters = [];
foreach ( $fn->getElementsByTagName("Arg") as $arg )    {
    if ( $arg->hasAttribute("value") )  {
        $parameters[] = $arg->getAttribute("value");
    }
    else    {
        $parameters[] = ${$arg->getAttribute("name")};
    }
}

// Call the function
$func(...$parameters);   // Displays Web_G->1234

ограничения в том, что вы не можете использовать такие вещи, как массивы (name="m[1]"), объекты (name="m->var1"), передача по ссылке и другие ограничения.

...