as Lukas and Johannes have requested, I have removed $this support from
Closures in PHP 5.3.
Technical details on the changes can be found here:
(I didn't have time to write new tests for everything, I just removed
those tests which didn't make sense at all and changed the rest in order
to accommodate the current semantics.)
I'd like to add that the Reflection part was really quite a mess.
Marcus's property-calling-patch was not correctly revoked from the
Reflection part (there was still quite a bit of code there in
php_reflection.c). Also there were (independent of that) some changes to
my original proposal that - as far as I know - were never discussed
on-list. Which in this case caused two problems: Inconsistencies (see
ReflectionParameter part in the above page) and there were some memory
management issues (which don't occur if you keep your objects always
around at least as long as the reflection objects themselves - and thus
not during simple tests - but nevertheless issues). I don't want to
assign blame here to anyone (the errors are errors I could have *easily*
made myself), I just want to point out that if the changes had actually
been discussed beforehand, this could have been avoided.
I recognize that not everybody will be 100% happy with the changes I
made to reflection even in light of the $this removal. However, in the
few days it took until the beta1 freeze (today) I think I have found the
sanest consistent solution for the problems. I do however acknowledge
that we may need to tweak some minor things wrt. reflection here and
there after beta 1.
Also: I have NOT changed HEAD. This is only in the PHP_5_3 branch. I
have also NOT ported the MM fixes to HEAD. It is far less trouble to
simply wait until we have figured out $this in closures.
---------------------------- snip -------------------------------------
In light of everything that went wrong with Closures and OOP due to
people wanting to improve something, I'd like to propose the following:
Whenever *any* change is made to either the language core itself or to
Reflection - that is not just a simple bugfix but rather a change in
certain semantics - there should be an RFC page in the wiki for this
purpose with LOTS of userland example code to demonstrate the semantics
and to be able to think it all through more thoroughly. And only after
an on-list discussion the changes should be made. And a page in the wiki
should really be required instead of a simple mail (and the wiki page
should actually be updated) because when it really comes down to it, you
don't find the mail again.
With Closures and OOP we had the situation that changes were committed
both to Reflection and core where only later other people actually saw
what they meant and this caused a discussion after the code was in a
half-baked state. Also, there was not enough userland example code
available from all sides for quite a while so that the discussion
remained on the same spot for too long. I really would like to avoid
that in the future and thus I think the above idea would be really helpful.
To sum it up again: For every non-bugfix change to core or Reflection
[*] that affects semantics: proposal in the wiki, lots of userland
example code to demonstrate the change, discussion on-list.
[*] Possibly more extensions. Reflection is especially tricky since it
has to reflect the PHP core quite well on the one hand and on the other
hand has to be very self-consistent which is quite hard due to all the
inter-dependencies. It took me the last few days to figure the above
changes all out and to make them consistent.