Hello Andi, Marcus,
method_exists() is quite vital to help where the type hinting fail.
Type hinting fail because it leads to a fatal error which is uncatchable
and the code cannot react on this. Therefore, for me type hinting is
kind of useless since I cannot catch my bugs by executing some code whenever
the data passed is not what the function/method expects. Reflection API is
overkill to write everywhere and has to be wrapped to something which at
the end will simulate method_exists().

Thanks for you attention,
Andrey

Marcus Boerger wrote:
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






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



Reply via email to