在 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"
)、通过引用传递等东西,还有其他限制。
我不知道这是否可能。
我完全知道如果$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"
)、通过引用传递等东西,还有其他限制。