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

Reply via email to