Patch: recursive call to __get() error

php.internals

Peter Hodge

19 years ago
Hello, This patch for 5.2 provides an alternative error when you accidentally call __get() recursively when trying to access some property of a class. Currently, PHP says: "Notice: Undefined property: someClass::$someProperty" which makes it seem as though __get() is not called at all. This patch changes the error to: "Warning: Recursive call to __get() trying to read property: someClass::$someProperty" regards, Peter --- Zend.original/zend_object_handlers.c Fri Dec 22 10:36:32 2006 +++ Zend/zend_object_handlers.c Fri Dec 22 10:47:29 2006 @@ -325,30 +325,40 @@ zend_guard *guard; if (zobj->ce->__get && - zend_get_property_guard(zobj, property_info, member, &guard) == SUCCESS && - !guard->in_get) { - /* have getter - try with it! */ - guard->in_get = 1; /* prevent circular getting */ - rv = zend_std_call_getter(object, member TSRMLS_CC); - guard->in_get = 0; + zend_get_property_guard(zobj, property_info, member, &guard) == SUCCESS) { + /* only if not already in __get() */ + if(!guard->in_get) { + /* have getter - try with it! */ + guard->in_get = 1; /* prevent circular getting */ + rv = zend_std_call_getter(object, member TSRMLS_CC); + guard->in_get = 0; - if (rv) { - retval = &rv; - if (type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) { - if (rv->refcount > 0) { - zval *tmp = rv; + if (rv) { + retval = &rv; + if (type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) { + if (rv->refcount > 0) { + zval *tmp = rv; - ALLOC_ZVAL(rv); - *rv = *tmp; - zval_copy_ctor(rv); - rv->is_ref = 0; - rv->refcount = 0; - } - if (Z_TYPE_P(rv) != IS_OBJECT) { - zend_error(E_NOTICE, "Indirect modification of overloaded property %s::$%s has no effect", zobj->ce->name, Z_STRVAL_P(member)); + ALLOC_ZVAL(rv); + *rv = *tmp; + zval_copy_ctor(rv); + rv->is_ref = 0; + rv->refcount = 0; + } + if (Z_TYPE_P(rv) != IS_OBJECT) { + zend_error(E_NOTICE, "Indirect modification of overloaded property %s::$%s has no effect", zobj->ce->name, Z_STRVAL_P(member)); + } } + } else { + retval = &EG(uninitialized_zval_ptr); + } + } + else { + /* already in __get() */ + if (!silent) { + zend_error(E_WARNING, "Recursive call to __get() trying to read property: %s::$%s", + zobj->ce->name, Z_STRVAL_P(member)); } - } else { retval = &EG(uninitialized_zval_ptr); } } else { Send instant messages to your online friends http://au.messenger.yahoo.com