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

在PHP函数调用中循环变量引用,php,function,loops,arguments,xmlnodelist,Php,Function,Loops,Arguments,Xmlnodelist,我不知道这是否可能 我完全知道,如果$stringname='Rating',那么$stringname()将与函数调用Rating()相同。我还知道如果$stringname='size',那么${$stringname}将与$size相同。我的想法取决于这些事实 我要做的是为PHP插入一个XML函数调用,将函数的结果插入到一些文本中 此XML函数调用的两个示例是: <Function name="ListCensors"> <Arg name="pginf" /&g

我不知道这是否可能

我完全知道,如果
$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>

我正在尝试——但失败了——的是设置一些东西,
元素可以引用我定义的任何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
$def=”
';
$dom=new\DOMDocument();
$dom->loadXML($def);
//测试要调用的函数
功能测试(字符串$a、字符串$b){
echo“{$a}->{$b}”.PHP_EOL;
}
//为调用设置一个变量
$m=“1234”;
//只需使用第一个函数定义
$fn=$dom->getElementsByTagName(“函数”)[0];
//函数名
$func=$fn->getAttribute('name');
//提取参数
$parameters=[];
foreach($fn->getElementsByTagName(“Arg”)作为$Arg){
如果($arg->hasAttribute(“值”)){
$parameters[]=$arg->getAttribute(“值”);
}
否则{
$parameters[]=${$arg->getAttribute(“名称”)};
}
}
//调用函数
$func(…$参数);//显示网页->1234
这有一些限制,比如不能使用数组(
name=“m[1]”
)、对象(
name=“m->var1”
)、按引用传递以及其他限制

$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')}
    }
});
$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