Hello Andrey,

  same goes for property_exists() which is why i added it.

marcus

Friday, April 8, 2005, 6:31:48 PM, you wrote:

>    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
>> 
>> 
>> 
>> 
>> 




-- 
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