Hello Andi, to this i only agree under two conditions. First we remove other like method_exists() too and second we fix handling of implicit public and dynamic properties. Unless the second is done i see such a function as relative important and don't like to use reflection overhead always.
regards marcus Friday, April 8, 2005, 6:00:03 PM, you wrote: > Marcus, > There was a long discussion about this a few months ago. > The conclusion was to use the reflection_api for the very few instances > where isset() isn't relevant. > Although we have done bad stuff in the past, it's also not a good idea to > continue polluting the global namespace. > Please revert this patch. > FYI, all the other requests for additional functions like > class_constant_exists() should also be reflection API. It's best for the > language. > Thanks, > Andi > At 01:33 PM 4/8/2005 +0000, Marcus Boerger wrote: >>helly Fri Apr 8 09:33:17 2005 EDT >> >> Modified files: >> /ZendEngine2 zend_builtin_functions.c >> Log: >> - Add property_exits() >> >>http://cvs.php.net/diff.php/ZendEngine2/zend_builtin_functions.c?r1=1.262&r2=1.263&ty=u >>Index: ZendEngine2/zend_builtin_functions.c >>diff -u ZendEngine2/zend_builtin_functions.c:1.262 >>ZendEngine2/zend_builtin_functions.c:1.263 >>--- ZendEngine2/zend_builtin_functions.c:1.262 Mon Apr 4 13:23:38 2005 >>+++ ZendEngine2/zend_builtin_functions.c Fri Apr 8 09:33:15 2005 >>@@ -17,7 +17,7 @@ >> >> +----------------------------------------------------------------------+ >> */ >> >>-/* $Id: zend_builtin_functions.c,v 1.262 2005/04/04 17:23:38 stas Exp $ */ >>+/* $Id: zend_builtin_functions.c,v 1.263 2005/04/08 13:33:15 helly Exp $ */ >> >> #include "zend.h" >> #include "zend_API.h" >>@@ -43,6 +43,7 @@ >> static ZEND_FUNCTION(get_class); >> static ZEND_FUNCTION(get_parent_class); >> static ZEND_FUNCTION(method_exists); >>+static ZEND_FUNCTION(property_exists); >> static ZEND_FUNCTION(class_exists); >> static ZEND_FUNCTION(interface_exists); >> static ZEND_FUNCTION(function_exists); >>@@ -102,6 +103,7 @@ >> ZEND_FE(get_class, NULL) >> ZEND_FE(get_parent_class, NULL) >> ZEND_FE(method_exists, NULL) >>+ ZEND_FE(property_exists, NULL) >> ZEND_FE(class_exists, NULL) >> ZEND_FE(interface_exists, NULL) >> ZEND_FE(function_exists, NULL) >>@@ -889,6 +891,63 @@ >> } >> /* }}} */ >> >>+/* {{{ proto bool property_exists(mixed object_or_class, string >>property_name) >>+ Checks if the object or class has a property */ >>+ZEND_FUNCTION(property_exists) >>+{ >>+ zval **object, **property; >>+ zend_class_entry *ce, **pce; >>+ zend_property_info *property_info; >>+ char *prop_name, *class_name; >>+ >>+ if (ZEND_NUM_ARGS()!= 2 || zend_get_parameters_ex(2, &object, >>&property)==FAILURE) { >>+ ZEND_WRONG_PARAM_COUNT(); >>+ } >>+ convert_to_string_ex(property); >>+ >>+ switch((*object)->type) { >>+ case IS_STRING: >>+ if (zend_lookup_class(Z_STRVAL_PP(object), >>Z_STRLEN_PP(object), &pce TSRMLS_CC) == SUCCESS) { >>+ ce = *pce; >>+ } >>+ if (!ce) { >>+ RETURN_NULL(); >>+ } >>+ if (!(property_info = zend_get_property_info(ce, >>*property, 1 TSRMLS_CC)) || property_info == &EG(std_property_info)) { >>+ RETURN_FALSE; >>+ } >>+ if (property_info->flags & ZEND_ACC_PUBLIC) { >>+ RETURN_TRUE; >>+ } >>+ zend_unmangle_property_name(property_info->name, >>&class_name, &prop_name); >>+ if (!strncmp(class_name, "*", 1)) { >>+ if (instanceof_function(EG(scope), ce TSRMLS_CC)) { >>+ RETURN_TRUE; >>+ } >>+ RETURN_FALSE; >>+ } >>+ if (zend_lookup_class(Z_STRVAL_PP(object), >>Z_STRLEN_PP(object), &pce TSRMLS_CC) == SUCCESS) { >>+ ce = *pce; >>+ } else { >>+ RETURN_FALSE; /* shouldn't happen */ >>+ } >>+ RETURN_BOOL(EG(scope) == ce); >>+ RETURN_FALSE; >>+ >>+ case IS_OBJECT: >>+ if (Z_OBJ_HANDLER_PP(object, has_property) && >>Z_OBJ_HANDLER_PP(object, has_property)(*object, *property, 1 TSRMLS_CC)) { >>+ RETURN_TRUE; >>+ } >>+ RETURN_FALSE; >>+ >>+ default: >>+ zend_error(E_WARNING, "Parameter must either be an object >>or the name of an existing class"); >>+ RETURN_NULL(); >>+ } >>+} >>+/* }}} */ >>+ >>+ >> /* {{{ proto bool class_exists(string classname [, bool autoload]) >> Checks if the class exists */ >> ZEND_FUNCTION(class_exists) >> >>-- >>Zend Engine CVS Mailing List (http://cvs.php.net/) >>To unsubscribe, visit: http://www.php.net/unsub.php -- Best regards, Marcus mailto:[EMAIL PROTECTED] -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php