Hi all,

At compile time, the engine detects whether $this is used in an op
array (using opline_is_fetch_this()). If so, it sets the flag
op_array->uses_this.
At the start of each execute loop, if this flag is set and a context
object is available, a reference to the context object is added to the
locals map. Thus the userspace $this reference is created.

Problem is, the compile time check does not detect dynamic uses of
$this, resulting in inconsistent behaviour in several areas, such as:
--> When using get_defined_vars().
--> When accessing $this as a variable variable.
Illustration here: http://pastebin.ca/920973

This could be solved by creating $this regardless of the
op_array->uses_this flag - i.e. only if an appropriate context object
has been set.
Simple patch: http://pastebin.ca/920986.
I tried it, and it only breaks one test:
Zend\tests\get_defined_vars.phpt (with the patch, get_defined_vars()
shows $this, which is arguably the correct behaviour).

So the compile-time decision to avoid adding $this as a local
userspace variable clearly has disadvantages. What are the advantages?
If it's for performance only, is the optimisation worth the
inconsistency that it causes?

Regards,
Robin

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

Reply via email to