是否可以在 XML 中编写 PHP 函数
<doThis>
doThis(){
bang bang bang!
}
</doThis>
并使用simplexml_load_file
该功能获取对象?
$foo = simplexml_load_file($xmlAbove);
$foo->doThis(); //bang bang bang!
首先,您应该始终考虑像这样运行“代码”的安全隐患。如果此 XML 文件具有远程来源,并且您执行代码,那么它可能会做任何事情。怎么样exec(rm -fR /some/important/path);
?还是删除所有内容的数据库调用?发送者和您的代码之间需要有非常强的信任关系,并且还需要强大的安全协议来防止中间人攻击和其他攻击。
对于你的问题,这是不可能的。正如所评论的,XML 是数据,而不是代码,并且应该是可移植的,这意味着您的 PHP 代码对于接受此 XML 的另一个客户端来说是无意义的。
但是,您可以使用eval
. 也许是这样的:
eval($foo->doThis);
注意:我根本不推荐这个。这不是 XML 的预期用途,它有很多问题。请想点别的办法。
XML 支持嵌入所谓的处理指令(PI),有效的 XML 可能如下所示:
<doThis><?php
doThis()
{
bang bang bang!
}
?></doThis>
这与您从 PHP 语言中所知道的非常相似。然而,仅支持意味着您可以将处理指令放在那里,但这些指令的处理不属于 XML 的业务。
此外,您使用的 XML 解析器 - SimpleXML - 对处理指令没有专门的支持。您可以使用DOMDocument来代替。来自 XML 方面的内容太多了。
对于 PHP 方面,您遇到的问题是您以某种方式定义了一个函数,而您却想调用它。此外,PHP 代码在其他部分无效(可能是因为您只是提出了一个快速问题)。也许这样更好:
<doThis><?php
function doThis()
{
return 'bang bang bang!';
}
?></doThis>
使用一些基于 DOM 的小解析器(这里称为PiDOMDocument
),可以将其转换为类/对象:
$doc = new PiDOMDocument();
$doc->loadXML($xml);
$obj = $doc->getObject();
echo $obj->doThis();
echo
最后一行的输出是:
bang bang bang!
(平息惊喜)。您可以在内部将其映射到 SimpleXMLElement 以将其简化为上面的示例代码:
$foo = simplexml_load_string($xml, 'PiSimpleXMLElement');
echo $foo->doThis(); //bang bang bang!
这就像:
/**
* SimpleXMLElement integration of PiDOMDocument
*/
class PiSimpleXMLElement extends SimpleXMLElement
{
public function __call($name, $args) {
$doc = new PiDOMDocument();
$doc->loadXML($this->asXML());
$callback = array($doc->getObject(), $name);
return call_user_func_array($callback, $args);
}
}
作为 PHP 处理器,您可以使用eval
or include
(两者基本相同)。PHP 是直接执行的,所以如果你的代码有致命的解析错误,整个脚本就有致命的错误,如果你不喜欢这个 PHP 默认行为,你可以在 eval'ing 之前解析字符串,看看token_get_all()
这个例子或这个例子。