> One could use zend_get_type_by_const() for help :)
I wasn't aware of that function, thanks!  I based it off of gettype (
http://lxr.php.net/opengrok/xref/PHP_5_4/ext/standard/type.c#26 ).
I'll update the patch tonight.

> And before that, we would need several RFC (one per concept seems to be a
> good idea).

Well, considering they are tied together (at least __assign is useless
without the __castTo), wouldn't the two of them fall into the same
RFC?

And I'm planning on writing out an RFC for it.  I just wanted to get
some comments and flush out the concept before writing an official
patch and RFC.  That's why I made a POC patch, to investigate the
ramifications and prove it could be done before finalizing and
proposing exactly how it should work...

Thanks,

Anthony

On Tue, Feb 28, 2012 at 5:54 AM, jpauli <jpa...@php.net> wrote:
> 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
>>
>

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to