Re: Re: [ZEND-ENGINE-CVS] cvs: ZendEngine2 / zend_API.c
| From: | Adam Maccabee Trachtenberg | Date: | Mon, 01 Dec 2003 15:41:39 +0000 |
| Subject: | Re: Re: [ZEND-ENGINE-CVS] cvs: ZendEngine2 / zend_API.c | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-5886@lists.php.net to get a copy of this message | ||
All I want to be able to do is this:
$s = simplexml_load_file('rss.xml');
foreach ($s->item as $item) {
print htmlentities($item->title . "\n");
}
That's not *all* I want to do, but this is my three-line test case. If
we can figure out a way to make this work, then I'm a happy camper.
I *don't* think it's realisitic to make a person explictly cast
$item->title to a string here. That's not SimpleXML, that's
ConfusingXML, particularly when this works perfectly fine:
print $item->title;
I can't imagine any user in the world understanding why one works and
the other doesn't.
Additionally, I don't think only supporting a print-only __toString()
method is a good thing. That assumes we operate in a CLI context. In a
Web context, people need to call htmlentities() on their data to
ensure their HTML is valid and to prevent XSS attacks. A non-safe lazy
default is asking for trouble.
As to whether this type of magic should be allowed only in C
extensions versus userland classes, is there a fundamental technical
issue or are we only trying to prevent novices from shooting
themselves in the foot?
-adam
On Mon, 1 Dec 2003, Wez Furlong wrote:
> I favour a), if you mean that (string)$com_object will work.
> I'm not so bothered with userspace objects.
>
> b) is just wrong for overloaded objects; if we do some magic
> and either hide an existing __toString() method, or call one
> with the wrong parameters (it might implement one differently
> to the way that we expect), then we end up in trouble.
>
> --Wez.
>
> > I think there are two options:
> > a) Revert the cast operator patch and don't support automatic string
> > conversion by PHP objects (i.e. allowing overloading extensions to support
> > it). But you still shouldn't expect automagical conversions when passing
> > COM objects to functions which accept strings as a parameter.
> > b) Add a __toString() C API function and make $obj->__toString() call
> that.
> > It would mean that your COM example would look like
> > serialize($com_object->__toString()).
> >
> > Personally, I prefer (b) but I think I can live with both.
> > Note: In both cases you won't have automatic conversions.
> >
> > Andi
> >
> >
> >
>
>
--
adam@trachtenberg.com