This is an old revision of the document!
Removal of $this in closures
(NOTE THAT THIS IS NOT COMMITTED YET. THIS PAGE IS STILL WORK IN PROGRESS)
This document describes the changes that were done in order to remove $this support from closures for PHP 5.3 beta1. This has become necessary in order to make sure that when a consensus is found on how to add $this to closures, it will be able to integrate that without BC issues.
Userland perspective
In the userland perspective, $this may not be used in closures. Also, using the static keyword in front of function is not allowed anymore. Examples:
$closure = function () { }; // still works $closure = static function () { }; // DOES NOT WORK class Foo { public $pubMember; private $privMembeR; function bar { $closure = function () { return $this; // DOES NOT WORK }; $closure = static function () { // DOES NOT WORK }; $closure = function () { echo "Hello World!\n"; }; // still works $closure = function () use ($this) { ... }; // DOES NOT WORK $self = $this; $closure = function () use ($self) { // still works echo $self->pubMember; // still works echo $self->privMember; // DOES NOT WORK }; } }
Yes, these are quite some restrictions on closures, however, this is the only possibility to ensure that support for $this can be added in any fashion that may later be required.
Internals perspective
- zend_closure structure: this_ptr member is gone.
- removed zend_get_closure() prototype in zend_closures.h (was not implemented anyway anymore since it's now done via a handler)
- removd scope and this_ptr parameters from zend_create_closure()
- removed zend_get_closure_this_ptr
Important note on get_closure handler
However, the get_closure handler prototype was NOT changed (only the implementation for closures, which always set the scope and object ptr to NULL) and still allows the handler implementation to set a scope and this_ptr because the handler is also responsible for __invoke on normal objects!
Reflection
TBD.