SimpleXML 中的一个注意事项

caixw

SimpleXML 提供了一套简单快速的 XML 操作方法,大大地提高了 XML 操作的效率。但是有时不小心也会带来不小的麻烦,看下面一段代码:

$xml = simplexml_load_string('title');
$title = $xml->title;
echo $title;

$xml->title = 'test';
echo $title;

猜猜第二个输出结果会是多少?是 test,而不是想像中的 title。为什么会这样呢?原因在这里:

echo gettype($xml->title) // object
echo get_class($xml->title); // SimpleXMLElement

看到了吗,$xml->title 是一个 SimpleXMLElement 类的实例,而不是字符串。所以 $title 实际上保存的是一个到 SimpleXMLElement 类的一个引用,而不是字符串的副本。想要得到字符串的副本只能进行类型转换:

$title = (string)$xml->title; // 获得字符串
$xml->title = 'test';
echo $title; // 输出 title

SimpleXMLElement 应该是实现了一个类似于 __tostring() 的接口(有兴趣的可以去看一下 PHP 的源码,在 ext/simplexml/ 中),才能在 echo 等表达式中表现类似于一个字符串。所以还有个地方需要注意:

$_SESSION['test'] = $xml->title; // 保存一个 SimpleXMLElement 变量到 SESSION 中
$_SESSION['test'] = (string)$xml->title; // 字符串
$_SESSION['test'] = strval($xml->title); // 这样也行。