[Someone remove that other Patanjali's note, because it has errors! :-(]
For those for whom it may not be immediately obvious from the example, the echo is what is forcing __toString() to be used.
However, to assign the text of a node (but not its children) to a variable:
$XML = new SimpleXMLElement('<p>Hello<span> world</span>.<span> Good day!</span></p>');
$Text = $XML->__toString();
is effectively:
$Text = 'Hello.'; // The <span>s are ignored.
Either of:
$Text = $XML->span->__toString();
$Text = $XML->span[0]->__toString();
is effectively:
$Text = ' world'; // Only the first <span> is used.
$Text = $XML->span[1]->__toString();
is effectively:
$Text = ' Good day!'; // Only the second <span> is used.