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