在 PHP 函数调用中循环变量引用

Looping through variable references within a PHP function call

我不知道这是否可能。

我完全知道如果$stringname = 'Rating',那么$stringname()将与函数调用Rating()相同。我也知道,如果 $stringname = 'size',那么 ${$stringname} 将与 $size 相同。我的想法取决于这些事实。

我想做的是在 PHP 的 XML 函数调用中插入一个函数的结果到一些文本中。

此 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 函数并循环遍历Arg 元素将正确的信息发送到这些 PHP 函数。这样做的正确方法是什么?如果不可能,请告诉我,以便我找出不同的做事方式。谢谢。

我认为这可以满足您的需求,我将在最后讨论一些潜在的问题。

在这个例子中,我只是用一个值和一个变量调用 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")、通过引用传递等东西,还有其他限制。