在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