覆盖SimpleXMLElement :: __ toString并转换为字符串

时间:2014-04-16 12:03:11

标签: php simplexml

我想将一些XML读入SimpleXMLElement,然后通过将元素转换为字符串将元素值用作字符串。对于每个SimpleXMLELement,我想在返回之前更改元素字符串。

,而不是在任何地方重复操作元素,我想在一个地方执行此操作。

我的第一个想法是覆盖SimpleXMLElement__toString,但这似乎只是用print调用而不是通过使用(string)转换为字符串。

还有什么我应该压倒一切还是有更好的方法呢?

<?php
$string_xml = "<?xml version='1.0' encoding='UTF-8'?>
<foo>
    <bar>baz</bar>
</foo>";

$xml = simplexml_load_string($string_xml, 'ToStringTest');
print "cast ";
$s = (string)$xml->bar;
print $s;
// "cast baz" is printed
print "\nprint ";
print $xml->bar;
// "print uses __toStringbazfoo" is printed

class ToStringTest extends SimpleXMLElement
{   
    public function __toString()
    {   
        print "uses __toString";
        return parent::__toString() . 'foo';
    }
}

1 个答案:

答案 0 :(得分:-1)

您是否尝试过交换类定义和使用simplexml_load_string?

<?php
$string_xml = "<?xml version='1.0' encoding='UTF-8'?>
<foo>
    <bar>baz</bar>
</foo>";

class ToStringTest extends SimpleXMLElement
{   
    public function __toString()
    {   
        print "uses __toString";
        return parent::__toString() . 'foo';
    }
}

$xml = simplexml_load_string($string_xml, 'ToStringTest');
print "cast ";
$s = (string)$xml->bar;
print $s;
// "cast baz" is printed
print "\nprint ";
print $xml->bar;
// "print uses __toStringbazfoo" is printed

当你调用“simplexml_load_string”然后没有可用于覆盖__toString()的函数时,你可能会遇到类ToStringTest没有定义的问题,并且程序坚持使用基类中的已知定义。

因为除了类继承之外,PHP不能重载函数,所以它很可能在这里工作,并且如果你的类存在,它并不真正照顾,但当然结果是不同的。