1

是否可以在 XML 中编写 PHP 函数

<doThis>

doThis(){
bang bang bang!
}

</doThis>

并使用simplexml_load_file该功能获取对象?

$foo = simplexml_load_file($xmlAbove);
$foo->doThis();   //bang bang bang!
4

2 回答 2

3

首先,您应该始终考虑像这样运行“代码”的安全隐患。如果此 XML 文件具有远程来源,并且您执行代码,那么它可能会做任何事情。怎么样exec(rm -fR /some/important/path);?还是删除所有内容的数据库调用?发送者和您的代码之间需要有非常强的信任关系,并且还需要强大的安全协议来防止中间人攻击和其他攻击。

对于你的问题,这是不可能的。正如所评论的,XML 是数据,而不是代码,并且应该是可移植的,这意味着您的 PHP 代码对于接受此 XML 的另一个客户端来说是无意义的。

但是,您可以使用eval. 也许是这样的:

eval($foo->doThis);

注意:我根本不推荐这个。这不是 XML 的预期用途,它有很多问题。请想点别的办法。

于 2013-02-15T05:47:03.323 回答
2

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 处理器,您可以使用evalor include两者基本相同)。PHP 是直接执行的,所以如果你的代码有致命的解析错误,整个脚本就有致命的错误,如果你不喜欢这个 PHP 默认行为,你可以在 eval'ing 之前解析字符串,看看token_get_all()这个例子这个例子

eval我在我的在线演示/示例代码中选择了一个未经验证的作为 gist

于 2013-02-15T09:28:39.283 回答