Currently, re-assignment of $this is handled in compile time but that won't
stop anyone from creating a referenc of $this and changing its value.  Of
course, any indirect changes to $this won't permanently change the object in
the way that changing $this in PHP4 would have since the value of this isn't
recovered from the symbol table at the end of the method nor will it effect
property/method access since these are handled at compile time.

The end result is the confusion found at http://bugs.php.net/28491

There are three options:

(A) Do nothing, "They shouldn't be trying that anyway!"  Obviously that
won't stop someone from attempting it...

(B) Prohibit creating references to $this.  Probably "good enough", but
(maybe?) there's a ligitmate use for it.

(C) Check the target variable against $this at execute time.  Has the
advantage of keeping the ability to create references of $this but slows
execution, especially when writing to object references from within another
object instance.  Note: I didn't compare against EG(This) because the act of
creating a reference to $this separates it from the original zval (which
already has a refcount of greater than 1).


Index: Zend/zend_execute.c
===================================================================
RCS file: /repository/ZendEngine2/zend_execute.c,v
retrieving revision 1.645
diff -u -r1.645 zend_execute.c
--- Zend/zend_execute.c 18 May 2004 00:04:22 -0000      1.645
+++ Zend/zend_execute.c 22 May 2004 20:06:55 -0000
@@ -790,6 +790,13 @@
                }
        }

+       if (EG(This) && (*retval)->type == IS_OBJECT && (*retval)->is_ref &&
(type == BP_VAR_W || type == BP_VAR_RW)) {
+               /* Make sure the variable we're writing to is not a
reference to $this */
+               zval **thistmp;
+               if (zend_hash_find(EG(active_symbol_table), "this",
sizeof("this"), (void **) &thistmp) == SUCCESS && *retval == *thistmp) {
+                       zend_error(E_ERROR, "Cannot re-assign a reference of
$this");
+               }
+       }

        if (free_tmp) {
                zval_dtor(varname);

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

Reply via email to