On Tue, Feb 28, 2012 at 6:05 AM, Anthony Ferrara <ircmax...@gmail.com>wrote:

> Ok, I've made a proof-of-concept patch here:
> https://gist.github.com/1929587
>
> Note that there are still a few memory leaks in there that would need
> to be cleaned up, but I just wanted to make a really quick POC before
> cleaning anything up to make it worthy of addition...
>
> One could use zend_get_type_by_const() for help :)

Another patch would need to be made for the __castFrom($value)
> implementation, but I think we'll split that off into another
> topic/RFC since that's quite a bit more work than this is...
>
> What are your thoughts?
>

Anyway... I like but the changes would really need some documentation.
And before that, we would need several RFC (one per concept seems to be a
good idea).



>
> It adds 2 new magic methods: __castTo($type) and __assign($value):
>
> __castTo($type) is called by the cast_object handler, and the get
> handler.  The cast_object handler will pass in the requested type as a
> string (NULL, boolean, integer, double, string, array, object,
> resource, callable).  Note that it does not check the return type (yet
> at least).  The get handler will pass in "native" as $type.  So that's
> used by combination operators (+=, +=, etc).
>
> __assign($value) is called by the set handler.  This gets called
> anytime the object is assigned to.  To allow for conditional
> assignment, if you return false from the handler, the value overwrites
> the zval (to allow for destructing of the object and not overriding
> assignment, if you want)...
>
> So, with this script:
>
> <?php
> class Foo {
>    public $value = 1;
> }
> class Bar {
>    public $value = 1;
>    public function __castTo($type) {
>        return $this->value;
>    }
>    public function __assign($value) {
>        $this->value = $value;
>        return $value != 10;
>    }
> }
>
> $a = new Foo;
> $b = new Bar;
> $a++;
> var_dump($a); // int(1) - Normal type casting rules apply here.
> $b++;
> var_dump($b); // object, value = 2, increment captured
>
> $a = new Foo;
> $b = new Bar;
> $a = 3;
> $b = 3;
> var_dump($a); // int(3) - Normal rules apply
> var_dump($b); // object, value = 3, assignment captured
>
> $a = new Foo;
> $b = new Bar;
> $a = 10;
> $b = 10;
> var_dump($a); // int(10) - Normal rules apply
> var_dump($b); // int(10) - False was returned, so normal assignment happens
>
>
> Now, for some casting:
> $a = new Foo;
> $b = new Bar;
> $a->value = 100;
> $b->value = 100;
> var_dump((int) $a); // int(1) - Normal type casting rules apply
> var_dump((int) $b); // int(100) - Cast was captured
>
> $a = new Foo;
> $b = new Bar;
> $a->value = 2;
> $b->value = 2;
> var_dump(substr("test", $a)); // string(1) "t"
> var_dump(substr("test", $b)); // string(1) "te"
>
> Anthony
>

Sorry for repeating, but why not RFC that ?

Julien.P


>
> On Mon, Feb 27, 2012 at 3:24 PM, Anthony Ferrara <ircmax...@gmail.com>
> wrote:
> > Rich,
> >
> > I appreciate the candid and honest nature of your reply, while
> > maintaining civility.  This list needs more of that. Further replies
> > inline:
> >
> > On Mon, Feb 27, 2012 at 1:54 PM, Richard Lynch <c...@l-i-e.com> wrote:
> >> On Mon, February 27, 2012 9:20 am, Anthony Ferrara wrote:
> >>>> I have to say that no matter how much a luv my OOP, turning every
> >>>> built-in type into an Object is just a Bad Idea...
> >>>>
> >>>> It's a form of bloat on RAM and CPU with minimal added value, imho.
> >>
> >>> Re-read what I had written.  I never said to turn every built-in type
> >>> into an object.  In fact, what I was talking about was keeping and
> >>> preserving the base types as-is.  All that I was proposing was adding
> >>> the ability to cast from and to the primitives.  That way you could
> >>> silently convert back and forth as needed (transparently when
> >>> possible).
> >>>
> >>
> >> I apologize that my brevity has been misconstrued.
> >>
> >> You are certainly free, even with the tools available in PHP, to
> >> "wrap" an object around integers, strings, and so on.
> >>
> >> There may even be occasions where I think that would be a Good Idea
> (tm).
> >
> > Well, you can kind of do it now.  You can't directly operate on those
> > objects.  You need to first manually cast them back to the native
> > type.  Take a look at SplFixedArray (
> > http://www.php.net/manual/en/class.splfixedarray.php ).  It has a pair
> > of methods, a static fromArray(), and a instance toArray().  What I'm
> > talking about is adding the ability to push these conversions down to
> > the engine level.
> >
> >> What I object to is building such a facility into core PHP, because:
> >>
> >> 1) You can already do it in userland, and I believe that's where it
> >> belongs.
> >
> > Actually, almost exactly the opposite.  You can't do it in userland,
> > but you can in a PECL extension (via cast_object(), get() and set()).
> > The first part of this proposal is basically just exposing those
> > methods (almost 1:1, only consolidating cast_object and get into a
> > single method with a parameter defining the difference).
> >
> >> 2) It unnecessarily [see 1] complicates core PHP, whose major
> >> strengths that drive its success includes its simplicity.
> >
> > Actually, the first part of the proposal doesn't really change the
> > core that much.  All it does is add standard object handlers to expose
> > cast_object (which is already partially exposed via __toString), get
> > and set (which are currently null).  There shouldn't really be other
> > changes required to the core for the first part at least.
> >
> > The second part of the proposal (the castFrom auto-casting) would
> > require some more changes to the core, and be much more significant.
> > To be honest, I think that would be a separate effort (and a separate
> > RFC) the more I think about it.
> >
> >>>> No matter which way you twist this pretzel:
> >>
> >> I had hoped that this bit would hint that all the proposals along
> >> these lines, including yours, are proposals I would vote against, even
> >> though I did over-blow your actual proposal.
> >>
> >>>> -1
> >>
> >>> So what it sounds like you're -1ing to, is not actually what was
> >>> proposed...
> >>>
> >>> I'm starting to work on a patch for this as a proof of concept...
> >>
> >> Please do so!
> >>
> >> I'll still vote -1, but obviously others will vote as they see fit.
> >>
> >> All these ideas are welcome.  The ones with complete patches even more
> >> so, as they allow a true idea of what the change would mean.
> >>
> >> Unfortunately, however, I must repeat that, so far, the idea has
> >> always fallen flat on its face when the proposer actually attempts to
> >> put action into deed, making a patch that fully meets their proposal.
> >>
> >> That doesn't mean you can't succeed, if you are more skilled than all
> >> your predecessors.
> >
> > I don't think skill has that much to do with it.  I think the real key
> > difference is what's being attempted...
> >
> > Anthony
> >
> >> --
> >> brain cancer update:
> >> http://richardlynch.blogspot.com/search/label/brain%20tumor
> >> Donate:
> >>
> https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FS9NLTNEEKWBE
> >>
> >>
> >>
> >> --
> >> PHP Internals - PHP Runtime Development Mailing List
> >> To unsubscribe, visit: http://www.php.net/unsub.php
> >>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>

Reply via email to