【问题标题】:Overriding SimpleXMLElement::__toString and casting to string覆盖 SimpleXMLElement::__toString 并转换为字符串
【发布时间】:2014-04-16 12:03:11
【问题描述】:

我有一些想要读入 SimpleXMLElement 的 XML,然后通过将元素转换为字符串,将元素值用作字符串。对于每个 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';
    }
}

【问题讨论】:

  • SimpleXML 的逻辑是用 C 语言而不是 PHP 编写的,因此可能不会为类似的事情调用 PHP 函数。除了重载__toString(),您还可以添加一个额外的方法,例如-&gt;getManipulatedString()
  • 理想情况下我想避免这种方法,除了构建 SimpleXMLElement 我希望应用程序的其余部分能够像对待任何其他 SimpleXMLElement 一样对待它
  • 没有更好的建议,如果将其添加为答案,我会接受。

标签: php simplexml


【解决方案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”时,您可能会遇到未定义类 ToStringTest 的问题,然后没有可用于覆盖 __toString() 的函数,并且程序当然坚持基类中的已知定义。

因为 PHP 不能重载除了类继承之外的函数,所以它很可能在这里静默工作,并且不会真正关心您的类是否存在,但结果当然是不同的。

【讨论】:

  • 谢谢,但这里不是这样,PHP 不能那样工作,也不能解释为什么 print 有效而 (string) 无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
相关资源
最近更新 更多